Rails Получение первого вложенного ресурса родительского ресурса, который соответствует логическому значению - PullRequest
0 голосов
/ 24 октября 2018

У меня есть вложенный ресурс (user_answer), который ссылается на ресурс parent (multiple_choice_question).Каждый пользователь может пытаться создать несколько_полученных запросов столько раз, сколько захочет, и система сохраняет каждый user_answer по щелчку.

Однако я хочу показать пользователю, сколько уникальных вопросов он получил сразу в первый раз.представление user_answer.

Например;На 100 вопросов пользователь ответил 33 сразу с первой попытки.(основано на .first или create_at, основано на времени)

Я написал этот запрос, но он не правильный.Не уверен, как сделать его более конкретным для того, что нужно.

@correct_on_first_attempt = @user.user_answers.where(:is_correct_answer => true).distinct.count(:multiple_choice_question_id).first

Модель UserAnswer

# == Schema Information
#
# Table name: user_answers
#
#  id                          :bigint(8)        not null, primary key
#  user_id                     :integer
#  multiple_choice_question_id :integer
#  selected_answer             :text
#  is_correct_answer           :boolean
#  created_at                  :datetime         not null
#  updated_at                  :datetime         not null
#
class UserAnswer < ApplicationRecord
  belongs_to :user
  belongs_to :multiple_choice_question
end

Модель MultipleChoiceQuestion

class MultipleChoiceQuestion < ApplicationRecord
  belongs_to :user, optional: true
  validates :user, presence: true

has_many :user_answers
has_many :users, through: :user_answers

1 Ответ

0 голосов
/ 24 октября 2018

Итак, во-первых, я думаю, вы ставите .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, а не просто как одинпредыдущее решение, но его легче понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...