我正在尝试创建一个类似于您在学校体验的测试应用程序。
我有一个模型问题,可以属于考试,测验或作业。
我应该为“:exam_id,:integer,:null => false;:quiz_id,:integer,:null => false;:assignment_id,:integer,:null => false;”?
这个问题属于一个或几个或全部(因此我可以在差异模型中重复使用相同的问题)。
我应该删除:null => false这样它可能属于他们中的任何一个....或者设置它的最佳方法是什么?
答案 0 :(得分: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})
并且它将根据问题模型中的其他字段确切地知道哪些问题属于哪个模型。
答案 1 :(得分:0)
我可能会为每个关系创建一个查找表,因此您将拥有exam_questions
,quiz_questions
和homework_questions
表。
其中每个都包含所有者的ID(例如exam_id
)和问题(question_id
)。
这样,如果一个问题只属于三个中的一个或两个,那么您可以为这些关系创建行。如果您要引入新的所有者类型(例如studyguide
或其他内容),这也可以非常轻松地添加新关系。
您可以使用此方法保留:null => false
,因为关系将存在或不存在。