Rails – 如何设置可属于3种不同模型的模型
我正在尝试制作一个测试应用程序,类似于您在学校的体验。
我有一个模型问题,可以属于考试,测验或作业。
我应该为“:exam_id,:integer,:null => false;:quiz_id,:integer,:null => false;:assignment_id,:integer,:null => false;”创建字段?
这个问题将属于其中一个或几个或全部(因此我可以在差异模型中重复使用相同的问题)。
我应该删除:null => false,以便它可以属于它们中的任何一个….或者设置它的最佳方法是什么?
听起来你想要做的就是使用多态关系。 您需要考试/测验/作业的通用名称,每个问题都属于其中一个。 假设您称之为评估,您可以像这样设置模型:
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})
并且它将根据问题模型中的其他字段确切地知道哪些问题属于哪个模型。
我可能会为每个关系创建一个查找表,因此您将拥有exam_questions
, quiz_questions
和homework_questions
表。
其中每个都包含所有者的id(例如, exam_id
)和问题( question_id
)。
这样,如果一个问题只属于三个中的一个或两个,您可以为这些关系创建行。 如果您要引入新的所有者类型(例如studyguide
或其他内容),这也可以很容易地添加新的关系。
您将使用此方法保留:null => false
,因为关系将存在或不存在。