我正在开发一个允许会员进行调查的应用程序(会员与“响应”具有一对多关系)。响应包含member_id,question_id及其答案。
该调查是全部提交或不提交的,因此,如果“响应”表中有该成员的任何记录,则表示他们已完成调查。
我的问题是,如何重新编写下面的查询,使其真正起作用?在SQL中,这将是EXISTS关键字的主要候选对象。
def surveys_completed
members.where(responses: !nil ).count
end
您可以使用includes
,然后测试相关响应是否存在,如下所示:
def surveys_completed
members.includes(:responses).where('responses.id IS NOT NULL')
end
这是另一种选择,方法是joins
:
def surveys_completed
members.joins(:responses)
end
使用Rails 4的解决方案:
def surveys_completed
members.includes(:responses).where.not(responses: { id: nil })
end
使用的替代解决方案activerecord_where_assoc
:该gem确实满足此处的要求:用于EXISTS
执行条件。它与最新版本的Rails 4.1一起使用。
members.where_assoc_exists(:responses)
它还可以做更多!
类似问题:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句