Rails:处理几个类似的模型类?
我正在建立一个课程申请系统。 高中,本科生和研究生都可以申请这门课程。 他们必须填写一些申请表。
但是,他们的信息表格相似,但不完全相同。 每个学生都有姓名,电话号码,电子邮件,地址等。但只有本科学生必须提供他们的GPA,研究生必须告诉他们正在研究哪个实验室。 还有其他微妙的差异……
那我该怎么处理呢? 做一个大桌子,但留下高中生的’GPA’栏是否为空? 或者使用三个单独的表?
此外, Student
(或在三个表格中, HighSchoolStudent
, UndergraduateStudent
和GraduateStudent
)和其他模型之间存在某种关系。 例如, Course
有很多Student
, Student
有很多Question
,等等。
您可以结合使用STI和Storefunction实现此目的。
使用名为settings
的文本列声明Student
的基本模型。
class Student < ActiveRecord::Base store :settings # name, email, phone, address etc.. end class HighSchoolStudent < Student # declare HighSchoolStudent specific attributes store_accessor :settings, :gpa end class UndergraduateStudent < Student # declare UndergraduateStudent specific attributes store_accessor :settings, :attr1 end class GraduateStudent< Student # declare GraduateStudent specific attributes store_accessor :settings, :attr2 end
在上面的示例中, HighSchoolStudent
实例将具有名为gpa
的属性。
您可以使用您认为的选项,例如将GPA保留为null,并为模型设置自定义validation,以便它仅根据学生类型进行检查。 单表inheritance也是一个选项,您可以在其中指定要在数据库表的列中使用的不同类名,然后只需在模型目录中添加这些类。 你可以在这里看到一些文档: http : //api.rubyonrails.org/classes/ActiveRecord/Base.html
我之前没有尝试过STI,但考虑到你上面所说的,我可能会选择那条路线,分支我的代码并看看它是如何实现的。