我正在建立一个课程申请系统。高中,本科和研究生都可以申请这门课程。他们必须填写一些申请表。
但是,他们的信息表格相似,但不完全相同。每个学生都有姓名,电话号码,电子邮件,地址等。但只有本科学生必须提供他们的GPA,研究生必须告诉他们正在研究哪个实验室。还有其他微妙的差异......
那我应该怎么处理呢?做一个大桌子,但留下高中生的'GPA'栏是否为空?或者使用三个单独的表?
此外,Student
(或在三个表格中,HighSchoolStudent
,UndergraduateStudent
和GraduateStudent
)和其他模型之间存在某种关系。例如,Course
有许多Student
s,Student
有很多Question
s,依此类推。
答案 0 :(得分:1)
使用名为Student
的文本列声明settings
的基本模型。
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
的属性。
答案 1 :(得分:0)
您可以使用您认为的选项,例如将GPA保留为null,并为模型设置自定义验证,以便仅根据学生类型进行检查。单表继承也是一个选项,您可以在其中指定要在数据库表的列中使用的不同类名,然后只需在模型目录中添加这些类。您可以在此处查看相关文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html
我之前没有尝试过STI,但考虑到你上面提到的内容,我可能会选择这条路线,分支我的代码并看看它是如何实现的。