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入力されているのは 1 つだけです (したがって、 console で実行すると1Course.all.countが得られます)。最初のものには現在 3 つが入力されていますが、実行すると(上記のように記述されたスコープ メソッドです)、コンソールに結果として3が表示されますが、これは正しくありません。クエリのさまざまな反復を試み、クエリに関するRails ガイドを調べましたが、何が間違っているのかわかりません。前もって感謝します。CoursequestionsCourse.most_answered.countmost_answeredCourse

4

1 に答える 1

3

私が収集できるものから、あなたの most_answered スコープは の合計で注文しようとしていquestions.answer_countます。

そのままでは はなくsum、最初のコースには 3 つの回答があるため、そのテーブルに結合すると 3 つの結果が生成されます。

あなたがする必要があるのは、次のようなものです:

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 に答える