Rails:处理几个类似的模型类?

时间:2012-04-17 17:37:41

标签: ruby-on-rails database-design

我正在建立一个课程申请系统。高中,本科和研究生都可以申请这门课程。他们必须填写一些申请表。

但是,他们的信息表格相似,但不完全相同。每个学生都有姓名,电话号码,电子邮件,地址等。但只有本科学生必须提供他们的GPA,研究生必须告诉他们正在研究哪个实验室。还有其他微妙的差异......

那我应该怎么处理呢?做一个大桌子,但留下高中生的'GPA'栏是否为空?或者使用三个单独的表?

此外,Student(或在三个表格中,HighSchoolStudentUndergraduateStudentGraduateStudent)和其他模型之间存在某种关系。例如,Course有许多Student s,Student有很多Question s,依此类推。

2 个答案:

答案 0 :(得分:1)

您可以结合使用STIStore功能实现这一目标。

使用名为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,但考虑到你上面提到的内容,我可能会选择这条路线,分支我的代码并看看它是如何实现的。