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 answer.
The survey is submitted all or nothing, so if there are any records in the Response table for that Member they have completed the survey.
My question is, how do I re-write the query below so that it actually works? In SQL this would be a prime candidate for the EXISTS keyword.
def surveys_completed members.where(responses: !nil ).count end
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With