Ruby on rails 活动记录基于子数据获取父记录

Ruby on rails 活动记录基于子数据获取父记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有几个相关的模型:类别有很多问题问题有许多答案。我需要: 获取所有类别,其中至少有一个问题有答案 统计至少有一个答案的所有问题(类别中有多少个问题有答案) 获取所有类别,其中所有问题都有0个答案 计算所有没有答案的问题(类别中有多少问题没有答案) 编辑 如果我想得到有答案的类别列表和没有答案的类别列表 cats = [] @categories_with_answers = Category.all.each do |cat| cats << cat if cat.questi

我有几个相关的模型:
类别
有很多问题<代码>问题
有许多
答案
。我需要:

  • 获取所有类别,其中至少有一个
    问题
    答案
  • 统计至少有一个答案的所有问题(类别中有多少个问题有答案)

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

  • 计算所有没有答案的问题(类别中有多少问题没有答案)
  • 编辑

    如果我想得到有答案的类别列表和没有答案的类别列表

    cats = []
    @categories_with_answers = Category.all.each do |cat|
      cats << cat if cat.questions.joins(:answers).count > 0
    end
    
    cats=[]
    @类别带答案=类别.全部.每个do | cat|
    猫0
    结束
    

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

    您可以使用
    包含
    连接
    来查询关系:

  • Category.join(问题:答案)

  • 问题。加入(:答案)。计数

  • Category.includes(问题::答案)。其中(问题:{answers:{question\u id:nil})

  • 问题。包括(:答案)。其中(答案:{Question\u id:nil})

  • 这里有一篇很好的博客文章详细讨论了这些方法:

    编辑

    对于单个类别,查询类似于:

    @category = Category.find(params[:category_id])
    
    @category.questions.joins(:answers).count
    
    这相当于:

    Question.joins(:answers).where(questions: { category_id: @category.id }).count
    
    同样的原则也适用于
    包括

    @category.questions.includes(:answers).where(answers: { question_id: nil })
    

    谢谢你的帮助,我怎样才能得到每个类别2和4的结果?我需要为我的每个类别计算至少一个答案的问题。而且,我还需要计算我的每一类中所有没有答案的问题。