2011-02-09 134 views
1

我在我的Job模型中有以下范围,似乎在我的语句中存在一些SQL差异问题。我们的开发数据库是mysql,显然heroku有postgres,并且由于某种原因它不断抱怨file_count。Activerecord postgres-mysql问题的解决方案

我打算只将这些范围转换为类方法,或者至少将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 

附加信息:

工作有许多audio_files和的AudioFile属于工作。

回答

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

没有数据库,MySQL除外,将接受此构造。您在SELECT部分​​中提到的不在聚合函数中的每列(如COUNT,MIN,MAX)必须位于GROUP BY中。你只在GROUP BY中有jobs.id。

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

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

Ps。 Don't use *在您的查询中,没有人知道结果可能是什么。