我有几个相关模型:Category
has_many
Question
。 Question
has_many
Answer
。我需要:
Question
具有Answer
统计所有至少有一个Answer
的问题(Category
内有多少问题有答案)
获取所有类别,其中所有问题都有0个答案
Category
内有多少问题,没有答案)。修改
如果我想获得带有答案的类别列表和没有答案的类别列表?
cats = []
@categories_with_answers = Category.all.each do |cat|
cats << cat if cat.questions.joins(:answers).count > 0
end
如何以更清洁的方式编写此代码段?
答案 0 :(得分:1)
您可以使用includes
和joins
来查询关系:
Category.joins(questions: :answers)
Question.joins(:answers).count
Category.includes(questions: :answers).where(questions: { answers: { question_id: nil }})
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 })