Как группировать записи, основанные на 3-й таблице, принадлежит, имеет много

#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')
  

То, что указано выше, в основном заключается в следующем:

  1. Quiz.joins(quiz_attempts: :student) — выберите все строки из quizzes таблицы, которые имеют связь с quiz_attempts students таблицами и.
  2. .where.not(students: { id: nil }) сверху выберите только те тесты, которые прошли учащиеся quiz_attempts .
  3. .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. Ха-ха. 😉 Мой плохой, но у тебя талант, братан;) спасибо за всю помощь.