Activerecord解决postgres-mysql问题

cor*_*ded 1 mysql postgresql activerecord ruby-on-rails-3

我的Job模型中有以下范围,似乎我的语句中存在一些SQL差异的问题.我们的dev db是mysql,显然heroku有postgres,并且由于某种原因它一直抱怨file_count.

我打算将这些范围转换为类方法,或者至少将SQL语句更改为活动记录,以便它可以独立于数据库.这有可能吗?我将如何开始这个?

我打算保持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
Run Code Online (Sandbox Code Playgroud)

附加信息:

Job有很多audio_files,AudioFile属于job.

Fra*_*ens 5

.select("jobs.*, COUNT(*) AS file_count")
.group("jobs.id")
Run Code Online (Sandbox Code Playgroud)

除MySQL之外,没有数据库会接受这种结构.您在SELECT部分​​中提到的每个列都不在聚合函数中(如COUNT,MIN,MAX)必须在GROUP BY中.您只在GROUP BY中有jobs.id.

您必须更改查询并提及GROUP BY中的所有列.

MySQL也存在这种结构的问题,在许多情况下它会产生奇怪/错误的结果.MySQL已经实现了SQL模式ONLY_FULL_GROUP_BY来关闭这种行为,MySQL现在也会拒绝这样的查询.

PS.不要在查询中使用*,没有人知道结果可能是什么.