我有以下模型,每个模型都是前一个模型的相关子模型(为简洁起见,我排除了其他模型方法和声明):
class Course < ActiveRecord::Base
has_many :questions
scope :most_answered, joins(:questions).order('questions.answers_count DESC') #this is the query causing issues
end
class Question < ActiveRecord::Base
belongs_to :course, :counter_cache => true
has_many: :answers
end
class Answer < ActiveRecord::Base
belongs_to :question, :counter_cache => true
end
现在我只填充了一个Course
(所以当我在控制台Course.all.count
中运行时,我得到 1 )。第一个Course
目前有三个questions
已填充,但当我运行Course.most_answered.count
时(most_answered
是我在Course
中编写的范围方法,如上所示),我得到 3 作为控制台的结果,这是不正确的。我已经尝试了查询的各种迭代,以及咨询Rails guide on queries,但似乎无法弄清楚我做错了什么。提前谢谢。
答案 0 :(得分:3)
根据我可以收集的内容,您最常回答的范围是尝试按questions.answer_count
的总和进行排序。
由于没有sum
,并且由于第一个课程有三个答案,因此您加入该表将产生三个结果。
您需要做的事情如下:
scope :most_answered, joins(:questions).order('questions.answers_count DESC')
.select("courses.id, courses.name, ..., SUM(questions.answers_count) as answers_count")
.group("courses.id, courses.name, ...")
.order("answers_count DESC")
您需要明确指定要选择的课程字段,以便在group by子句中使用它们。
编辑:
我提到courses.id, courses.name, ...
的两个地方(在选择和组中),您需要将其替换为您要选择的实际列。由于这是一个范围,因此最好选择课程表中的所有字段,但您需要单独指定它们。