2010-08-16 105 views
2

我试图做一个应用程序,测试类似于你会在学校体验。Rails - 如何设置模型,可以属于3个不同的模型之一

我有一个模型问题,它可以属于考试,测验或作业。

我应该为“:exam_id,:integer,:null => false”创建字段::quiz_id,:integer,:null => false;:assignment_id,:integer,:null => false;

这个问题将属于一个或几个或全部(所以我可以在差异模型中重复使用相同的问题)。

我应该删除:null => false,以便它可以属于它们中的任何一个....或者设置它的最佳方法是什么?

回答

5

这听起来像你想在这里做的是使用多态关系。你将需要一个通用名称来进行考试/测验/分配,每个问题都属于其中的一个。说你叫他们的评估,你将建立你的模型是这样的:

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 

然后,你将需要两个字段添加到您的问题型号:

assessment_id 
assessment_type 

有了这层关系,你可以用它如:

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

它会基于问题模型中的附加字段准确知道哪些问题属于哪个模型。

0

我可能会为每个关系创建一个查找表,因此您需要一个exam_questions,quiz_questionshomework_questions表。

其中每个包含所有者的id(例如exam_id)和问题(question_id)。

这样,如果问题属于三个中的一个或两个,您可以为这些关系创建行。如果您要引入新的所有者类型,例如studyguide或其他,您也可以很容易地添加新关系。

您将使用此方法保留:null => false,因为关系将存在或不存在。

相关问题