有效记录根据子数据获取父记录

问题描述:

我有几个相关型号: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 

如何以更清晰的方式编写此代码段?

您可以使用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

我更新我的问题,请参阅 –