1

我有以下模型,每个模型都是前一个模型的相关子代(为简洁起见,我排除了其他模型方法和声明):

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填充了一个(所以当我在 console 运行时Course.all.count,我得到1)。第一个Course当前questions填充了三个,但是当我运行时Course.most_answered.count(如上所示,most_answered我的范围方法是这样写的),我在控制台中得到3作为结果,这是不正确的。我已经尝试了查询的各种迭代,以及咨询Rails guide on queries,但似乎无法弄清楚我做错了什么。提前致谢。Course

4

1 回答 1

3

据我所知,您 most_answered 范围正试图按questions.answer_count.

因为它是 no 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, ...(在选择和组中),您都需要将其替换为您要选择的实际列。由于这是一个范围,因此最好选择课程表中的所有字段,但您需要单独指定它们。

于 2013-02-04T03:58:43.437 回答