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

Chr*_*len 2 database model ruby-on-rails relational-database

我正在尝试制作一个类似于您在学校体验的测试应用.

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

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

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

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

Pet*_*own 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
Run Code Online (Sandbox Code Playgroud)

然后,您需要在Question模型中添加两​​个字段:

assessment_id
assessment_type
Run Code Online (Sandbox Code Playgroud)

通过这种关系,你可以使用它:

@exam = Exam.create({:field1 => :val1})    
@exam.questions.create({:field1 => :question1})
@exam.questions.create({:field1 => :question2})
Run Code Online (Sandbox Code Playgroud)

并且它将根据问题模型中的其他字段确切地知道哪些问题属于哪个模型.