Подтвердить что ты не робот

Rails активная запись запросов к ассоциации с 'существует'

Я работаю над приложением, которое позволяет членам опроса (член имеет отношение "один к многим" с ответом). Ответ содержит member_id, question_id и их ответ.

Опрос отправляется полностью или ничего, поэтому, если в таблице ответов для этого члена есть какие-либо записи, они завершили опрос.

Мой вопрос: как мне переписать запрос ниже, чтобы он действительно работал? В SQL это будет основным кандидатом для ключевого слова EXISTS.

 def surveys_completed
    members.where(responses: !nil ).count
 end 
4b9b3361

Ответ 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 он не будет загружать связанные модели (что является преимуществом производительности, если они вам не нужны).