Rails - 如何设置可属于3种不同模型的模型

时间:2010-08-16 22:58:08

标签: ruby-on-rails database model relational-database

我正在尝试创建一个类似于您在学校体验的测试应用程序。

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

我应该为“:exam_id,:integer,:null => false;:quiz_id,:integer,:null => false;:assignment_id,:integer,:null => false;”?

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

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

2 个答案:

答案 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_questionsquiz_questionshomework_questions表。

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

这样,如果一个问题只属于三个中的一个或两个,那么您可以为这些关系创建行。如果您要引入新的所有者类型(例如studyguide或其他内容),这也可以非常轻松地添加新关系。

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