2016-04-24 123 views
1

我有幾個相關型號:Categoryhas_manyQuestionQuestionhas_manyAnswer。我需要:有效記錄根據子數據獲取父記錄

  1. 獲取所有類別,其中至少一個QuestionAnswer
  2. 計數的所有問題,即至少有一個Answer(多少問題裏面Category有答案)

  3. 獲取所有類別,其中所有問題都有答案

  4. 計算所有問題,這還沒有答案(Category,有多少問題沒有答案)。

編輯

如果我想要得到的類別清單,沒有答案類別的答案和列表?

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/

編輯

對於單個類別,查詢是相似的:

@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類的結果?我需要在leas one計數問題答案爲我的每個類別。而且,我還需要爲每個類別計算沒有答案的所有問題。 –

+0

查看我的更新回答。 –

+0

我更新我的問題,請參閱 –