Выборка моделей вместе с соответствующими атрибутами моделей соединения - PullRequest
1 голос
/ 16 декабря 2011

У меня есть модели:

class Exam < AR::Base
  has_many :questions_in_exams
  has_many :questions, :through => :questions_in_exams
end

class QuestionsInExam < AR::Base
  belongs_to :examination
  belongs_to :question
  # This model also has a "question_index" attribute
end

class Question < AR::Base
  has_many :questions_in_exams
  has_many :examinations, :through => :questions_in_exams
end

Учитывая экземпляр экзамена, я хочу получить все его вопросы вместе с дополнительными атрибутами из модели соединения (например, «question_index»).Как я могу добиться этого?

Если я сделаю:

e = Examination.find(1)
questions = e.questions

Тогда элементы в массиве вопросов не будут иметь атрибут "question_index"

Я думаю, я могу написать:

e = Examination.find(1)
questions = e.questions_in_exam(:include => "question")

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

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 21 декабря 2011

Начните с модели Вопроса, что-то вроде этого

Question.select("questions.*, examination.id")
        .joins(:questions_in_exam => :examination)
        .where("examinations.id=?", 1) 

# Note that inside "select" you can specified all the attributes you want from any of the joined models.

Как только вы будете удовлетворены запросом, преобразуйте его в scope

и ваш последний вызоввыглядит примерно так: Question.for_exam (1)

...