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.
.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现在也会拒绝这样的查询.
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |