Active Record根据子数据获取父记录

时间:2016-04-24 20:33:43

标签: ruby-on-rails activerecord

我有几个相关模型:Category has_many QuestionQuestion has_many Answer。我需要:

  1. 获取所有类别,其中至少有一个Question具有Answer
  2. 统计所有至少有一个Answer的问题(Category内有多少问题有答案)

  3. 获取所有类别,其中所有问题都有0个答案

  4. 计算所有没有答案的问题(Category内有多少问题,没有答案)。
  5. 修改

    如果我想获得带有答案的类别列表和没有答案的类别列表?

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

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

1 个答案:

答案 0 :(得分: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 })

  5. 这是一篇很好的博客文章,在这里更详细地讨论了这些方法: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 })