2010-08-16 12 views
2

J'essaie de faire une application qui fait des tests similaires à ce que vous expérimenter à l'école.Rails - Comment faire pour configurer le modèle qui peut appartenir à l'un des 3 modèles différents

J'ai une question de modèle, qui peut appartenir à un examen, un quiz ou une affectation. Dois-je créer des champs pour ": exam_id,: entier,: null => false;: quiz_id,: entier,: null => false;: assignment_id,: entier,: null => false;"?

La question appartiendra à l'un ou à quelques-uns ou à tous (pour que je puisse réutiliser la même question dans les modèles diff).

Dois-je retirer le: null => false pour qu'il puisse appartenir à l'un d'entre eux .... ou quelle est la meilleure façon de le configurer?

Répondre

5

Il semble que ce que vous voulez faire ici soit d'utiliser une relation polymorphe. Vous aurez besoin d'un nom générique pour examen/quiz/affectation et chaque question appartiendra à l'un de ceux-ci. Dites que vous les appelez évaluations, vous devez définir vos modèles comme celui-ci:

class Question << ActiveRecord::Base 
    belongs_to :assessment, :polymorphic => true 
end 

class Exam << ActiveRecord::Base 
    has_many :questions, :as => :assessment 
end 

class Quiz << ActiveRecord::Base 
    has_many :questions, :as => :assessment 
end 

class Assignment << ActiveRecord::Base 
    has_many :questions, :as => :assessment 
end 

Ensuite, vous devrez ajouter deux champs à votre modèle Question:

assessment_id 
assessment_type 

Avec cette relation, vous pouvez l'utiliser comme:

@exam = Exam.create({:field1 => :val1})  
@exam.questions.create({:field1 => :question1}) 
@exam.questions.create({:field1 => :question2}) 

et il saura exactement quelles questions auxquelles appartiennent modèle basé sur les champs supplémentaires dans votre modèle de question.

0

Je créerais probablement une table de consultation pour chaque relation, de sorte que vous auriez une table exam_questions, quiz_questions et . Chacun de ceux-ci contiendrait l'identifiant du propriétaire (exam_id par exemple), et la question (question_id). De cette façon, si une question appartenait à seulement deux ou trois des trois, vous pourriez simplement créer des lignes pour ces relations. Cela rend aussi très facile d'ajouter de nouvelles relations si vous introduisiez un nouveau type de propriétaire, comme studyguide ou quelque chose comme ça.

Vous laissez le :null => false avec cette méthode, car une relation existe ou ne l'est pas.