Rails active record querying association with 'exists'

后端 未结 4 1899
感动是毒
感动是毒 2020-11-27 03:22

I am working on an app that allows Members to take a survey (Member has a one to many relationship with Response). Response holds the member_id, question_id, and their answe

4条回答
  •  时光取名叫无心
    2020-11-27 03:40

    You can use includes and then test if the related response(s) exists like this:

    def surveys_completed
      members.includes(:responses).where('responses.id IS NOT NULL')
    end
    

    Here is an alternative, with joins:

    def surveys_completed
      members.joins(:responses)
    end
    

    The solution using Rails 4:

    def surveys_completed
      members.includes(:responses).where.not(responses: { id: nil })
    end
    

    Alternative solution using activerecord_where_assoc: This gem does exactly what is asked here: use EXISTS to to do a condition. It works with Rails 4.1 to the most recent.

    members.where_assoc_exists(:responses)
    

    It can also do much more!


    Similar questions:

    • How to query a model based on attribute of another model which belongs to the first model?
    • association named not found perhaps misspelled issue in rails association
    • Rails 3, has_one / has_many with lambda condition
    • Rails 4 scope to find parents with no children
    • Join multiple tables with active records

提交回复
热议问题