Итак, во-первых, я думаю, вы ставите .first
в конце, когда это на самом деле не требуется.Я думаю, что удаление, которое исправит ошибку, с которой вы столкнулись.Добавление .first
на самом деле не приводит к получению первого результата каждого набора записей.Он пытается извлечь «первый» результат из целого числа, что на самом деле невозможно.
Во-вторых, ваш запрос: @correct_on_first_attempt = @user.user_answers.where(:is_correct_answer => true).distinct.count(:multiple_choice_question_id)
пытается найти общее количество вопросов, заданных пользователем.Ответил пока правильно, но не имел никаких условий с первой попытки или нет.
Если вы хотите узнать, смог ли пользователь решить эту проблему с первой попытки или нет, это немного более сложное решение с помощью SQLпотому что вам нужно найти самый ранний ответ, предоставленный пользователем на каждый вопрос.
В зависимости от вашей базы данных, есть несколько решений, которые будут работать.В каждом случае я бы порекомендовал написать SQL-запрос и выполнить его, а не использовать вспомогательные функции Rails, потому что ActiveRecord не обеспечивает достаточной универсальности для вашего варианта использования.
Пример SQL-запроса:
SELECT COUNT(DISTINCT multiple_choice_question_id) FROM
(
SELECT multiple_choice_question_id,
user_id,
ROW_NUMBER () OVER (
PARTITION BY multiple_choice_question_id
ORDER BY created_at
) AS rn
FROM user_answers
WHERE user_id = 4
AND is_correct_answer = TRUE
)
WHERE rn = 1
Вам придется проверить это один раз;Я не проверял это.
Редактировать: Более Rails-EY решение:
distinct_question_ids = @user.user_answers.
where(is_correct_answer: true).
distinct.pluck(:multiple_choice_question_id)
@correct_on_first_attempt = distinct_question_ids.select { |qid|
@user.user_answers.
where(multiple_choice_question_id: qid).first.is_correct_answer
}.count
Это не очень хорошее решение, потому что на самом деле делает много запросов SQL, а не просто как одинпредыдущее решение, но его легче понять.