Rails активная запись запросов к ассоциации с 'существует'
Я работаю над приложением, которое позволяет членам опроса (член имеет отношение "один к многим" с ответом). Ответ содержит member_id, question_id и их ответ.
Опрос отправляется полностью или ничего, поэтому, если в таблице ответов для этого члена есть какие-либо записи, они завершили опрос.
Мой вопрос: как мне переписать запрос ниже, чтобы он действительно работал? В SQL это будет основным кандидатом для ключевого слова EXISTS.
def surveys_completed
members.where(responses: !nil ).count
end
Ответы
Ответ 1
Вы можете использовать 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
Похожие вопросы:
Ответ 2
Вы можете использовать ключевое слово SQL EXISTS
в элегантном стиле Rails-ish, используя Where Exists gem:
members.where_exists(:responses).count
Конечно, вы также можете использовать raw SQL:
members.where("EXISTS" \
"(SELECT 1 FROM responses WHERE responses.member_id = members.id)").
count
Ответ 3
Вы также можете использовать подзапрос:
members.where(id: Response.select(:member_id))
По сравнению с чем-то с includes
он не будет загружать связанные модели (что является преимуществом производительности, если они вам не нужны).