2011-02-09 5 views
1

私のジョブモデルには以下のスコープがあります。私のステートメントにSQLの不一致があるようです。私たちのdevdbはmysqlで、明らかにherokuにはpostgresがあり、それは何らかの理由でfile_countとして不平を言っています。postgres-mysqlの問題へのActiverecordの解決

これらのスコープをクラスメソッドに変換するか、少なくともSQLステートメントをアクティブなレコードに変更して、dbに依存しないようにする予定です。これはまったく可能なのですか?これをどうすれば始めることができますか?

私はis_activeを単純なスコープステートメントとして動作すると確信しているので、私はこれを保つつもりですが、with_unclassified_files_available_countにはリファクタリングが必要であり、ARリファクタが良いアイデアになると思います。

scope :is_active, where(:active => true) 
scope :with_unclassified_files_available_count, where("audio_files.category_id IS NULL") 
               .joins(AUDIO_FILES) 
               .select("jobs.*, COUNT(*) AS file_count") 
               .group("jobs.id") 
               .order("batch_identifier DESC") 
scope :has_files_available, with_unclassified_files_available_count.having("count(*) > 0") 
scope :available_to_work_on, is_active.has_files_available 

追加情報::、)私は提案を開いているので、

を教えてくださいここでは、コードをお勧めします

仕事は、多くのaudio_filesを持っており、オーディオファイルは、ジョブに属します。

答えて

5
.select("jobs.*, COUNT(*) AS file_count") 
.group("jobs.id") 

MySQL以外のデータベースは、この構成を受け入れません。 COUNT、MIN、MAXのような集合関数にないSELECT節で言及した各列は、GROUP BYになければなりません。 jobs.idはGROUP BYにしかありません。

クエリを変更してGROUP BYのすべての列に言及する必要があります。

また、MySQLではこの構成に問題があり、多くの場合、奇妙な結果が生成されます。 MySQLはこの動作をオフにするためにSQLモードONLY_FULL_GROUP_BYを実装しました。これでMySQLはこのようなクエリも拒否します。

ps。クエリにはDon't use *が含まれているため、結果はどのようなものかわかりません。