2016-04-24 11 views
1

私はいくつかの関連のモデルを持っています。 Questionhas_manyAnswer。私が必要とする:アクティブレコード取得親レコードは

  1. は、少なくとも一つのQuestionAnswer
  2. カウントを持っている全てのカテゴリー、少なくとも一つのAnswer(回答を持っているどのように多くの質問Category内側)

  3. がすべて取得したすべての質問を、取得しますすべての質問が0の回答を持つカテゴリ

  4. 回答がない質問を回答してください(答えは答えられていないCategoryの中にいくつの質問がありますか)。

EDIT

私は答えと答えのないカテゴリのリストとカテゴリの一覧を取得したい場合は?

cats = [] 
@categories_with_answers = Category.all.each do |cat| 
    cats << cat if cat.questions.joins(:answers).count > 0 
end 

私はこのスニペットをよりクリーンな方法で書くことができますか?

答えて

1

あなたが関係を照会するincludesjoinsを使用することができます。

  1. Category.joins(questions: :answers)

  2. Question.joins(:answers).count

  3. Category.includes(questions: :answers).where(questions: { answers: { question_id: nil }})

  4. Question.includes(:answers).where(answers: { question_id: nil })

これらのアプローチについて詳しくは、https://www.pagerduty.com/blog/sql-left-join-trick/のブログ記事をご覧ください。個々のカテゴリについては

EDIT

、クエリは同じです:

@category = Category.find(params[:category_id]) 

@category.questions.joins(:answers).count 

これはと同等のようになります。

Question.joins(:answers).where(questions: { category_id: @category.id }).count 

同じ原理がincludesに適用されます...

@category.questions.includes(:answers).where(answers: { question_id: nil }) 
+0

おかげさまで、カテゴリごとに2と4の結果をどのように得ることができますか?私は自分のカテゴリーごとに1つの答えを数える必要があります。また、私のカテゴリーごとに回答なしですべての質問を数える必要があります。 –

+0

私の更新された回答を参照してください。 –

+0

質問を更新してください –

関連する問題