连接多次错误显示的连接子模型结果项的查询

时间:2013-02-04 02:54:10

标签: ruby-on-rails ruby-on-rails-3 rails-models

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

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,但似乎无法弄清楚我做错了什么。提前谢谢。

1 个答案:

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