2011-12-16 14 views
1

属性:フェッチモデルは私がモデル持っ

試験のインスタンスを考える
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_in_exam(:include => "question") 

をしかし、これはいないようだ。

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

そして、質問配列の要素は、私は私が書くことができますね "question_index" 属性

を持っていません。私が必要とするデータの大部分はQuestionモデルの ですが、返される配列はQuestionInExamインスタンスで構成されているため、とてもエレガントです。

アイデア?質問モデルから

おかげ

+0

'include'はすべての' QuestionInExam'に対して 'Question'モデルを取得しますので、' qe.question'を呼び出してquesを取得します属性の属性。唯一の違いは、データの遅延または貪欲な負荷です。あなたが含まれている場合は、DBに2つのクエリを最大に持っています。 –

答えて

0

スタートを、この

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)

関連する問題