有效记录根据子数据获取父记录
问题描述:
我有几个相关型号:Category
has_many
Question
。 Question
has_many
Answer
。我需要:有效记录根据子数据获取父记录
- 获取所有类别,其中至少一个
Question
有Answer
计数的所有问题,即至少有一个
Answer
(多少问题里面Category
有答案)获取所有类别,其中所有问题都有答案
- 计算所有问题,这还没有答案(
Category
,有多少问题没有答案)。
编辑
如果我想要得到的类别清单,没有答案类别的答案和列表?
cats = []
@categories_with_answers = Category.all.each do |cat|
cats << cat if cat.questions.joins(:answers).count > 0
end
如何以更清晰的方式编写此代码段?
答
您可以使用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 })
感谢您的帮助,我如何才能得到2类和4类的结果?我需要在leas one计数问题答案为我的每个类别。而且,我还需要为每个类别计算没有答案的所有问题。 –
查看我的更新回答。 –
我更新我的问题,请参阅 –