#mysql #ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-4
#mysql #ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-4
Вопрос:
У меня есть приведенный ниже код:
quiz.rb
has_many :quiz_attempts
student.rb
has_many :quiz_attempts
quiz_attempt.rb
belongs_to :student
belongs_to :quiz
Что мне нужно сделать, это получить все записи student из таблицы quiz_attempts, которая имеет идентификатор викторины, и показать записи таблицы викторины на ее основе.
Означает, что если учащиеся прошли один тест A 10 раз и тест B 5 раз, поэтому мне нужно показать все эти строки как 2 из таблицы викторины.
В поле зрения у меня будет только 2 записи таблицы викторины, которые связаны с 15 записями A и B в совокупности в таблице quiz_attempts.
в quiz_id
quiz_attempts также есть столбец и столбец student_id, в таблице викторины нет идентификатора студента.
Запрос, с которым я работаю, является:
@quizzes = @student.quiz_attempts.includes(:quiz)
но проблема в том, что он по-прежнему показывает мне 2 строки, но из таблицы quiz_attempts, и я не могу сгруппировать их как таблицу викторины.
Мне нужно иметь полное решение.
Ответ №1:
Quiz.joins(quiz_attempts: :student)
.where.not(students: { id: nil })
.group('quizzez.id')
То, что указано выше, в основном заключается в следующем:
Quiz.joins(quiz_attempts: :student)
— выберите все строки изquizzes
таблицы, которые имеют связь сquiz_attempts
students
таблицами и..where.not(students: { id: nil })
сверху выберите только те тесты, которые прошли учащиесяquiz_attempts
..group('quizzez.id')
говорит, что мы не хотим, чтобы один и тот же тест показывался несколько раз, потому что многие учащиеся пытались его пройти, но только uniq-записи.
Редактировать
Как обсуждалось в комментариях, чтобы приведенный выше запрос был основан на current_user
идентификаторе, вы могли бы реализовать область AR:
class Quiz < ActiveRecord::Base
scope :by_student_id, lambda { |student_id|
joins(quiz_attempts: :student).where(students: { id: student_id }).group('quizzez.id')
}
end
Чтобы использовать эту область, вы бы написали:
Quiz.by_student_id(current_user.id)
Комментарии:
1. Не работает, он по-прежнему показывает 15 строк из таблицы викторины. он показывает записи из таблицы викторины, но их число равно 15. Должно быть только 2 записи, поскольку связанные 15 находятся в таблице quiz_attempts.
2. @LearningROR затем вам придется группировать по quizzez.id столбец, отредактированный ответ
3. @LearningROR рад помочь)
4. @LearningROR Я украинец : D Просто в последнее время я живу в Польше, но в любом случае добро пожаловать 🙂
5. Ха-ха. 😉 Мой плохой, но у тебя талант, братан;) спасибо за всю помощь.