1

私には次のような3つの関連モデルがあり、それぞれが上記のモデルの子です。

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モデルにあるスコープメソッドを使用して、表示するコースindexのリストを、アクションの中で最も多くの回答から最も少ない数で並べ替える方法CoursesControllerです。CoursesControllerそれを利用する方法はありますか、それともフィルターを機能させるために2レイヤーのダウンスコープメソッドを作成する必要がありますか?

ありがとう!

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

もう 1 つのオプションは、Question クラスで手動結合句を使用することです。

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

関連付けに counter_cache を設定する必要があると思います。Ryan Bates が最初のスクリーンキャストの 1 つで提案したように: 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 に答える