1

我有三个相关模型,如下所示,每个模型都是上述模型的子模型:

class Course < ActiveRecord::Base 
  has_many :questions 
end 

class Question < ActiveRecord::Base 
  belongs_to :course
  has_many: :answers

  default_scope order: 'questions.created_at DESC'
  scope :by_answer_count, -> { #orders Questions based on its answer count
    joins(:answers).reorder("count(answers.id) DESC").group(:id)
  }
end 

class Answer < ActiveRecord::Base 
  belongs_to :question
end

我无法弄清楚的是:我如何使用我的模型中的范围方法by_answer_count,以在 的操作中按最多的答案对我显示的课程Question列表进行排序?有没有办法利用它,或者我应该在我的范围内编写一个 2 层向下范围的方法来让过滤器工作?indexCoursesControllerCoursesController

谢谢!

4

2 回答 2

4

您应该能够使用合并来使其正常工作。

class Course < ActiveRecord::Base
  scope :by_answer_count, joins(:questions).merge(Question.by_answer_count)
end

编辑

合并的工作方式似乎存在错误。 https://github.com/rails/rails/issues/3002

您可以通过添加从课程到答案的关系来解决它。因此,您的 Course 课程将如下所示:

class Course < ActiveRecord::Base
  has_many :answers, through: :questions
  scope :by_answer_count, joins(:questions).merge(Question.by_answer_count)
end

另一种选择是在您的 Question 类中使用手动连接子句。

joins("answers ON answers.question_id = questions.id").reorder(...)
于 2013-02-02T05:55:48.103 回答
1

我认为你应该在你的关联上设置一个 counter_cache 。就像 Ryan Bates 在他的第一个截屏视频中建议的那样:http ://railscasts.com/episodes/23-counter-cache-column

我认为以下方法会起作用:

Course.joins(:questions).order('questions.answer_count DESC')

或范围:

scope :most_answered, joins(:questions).order('questions.answer_count DESC')

它还具有作为单个查询的好处。我没有测试,但它应该工作。

于 2013-02-02T06:28:50.510 回答