2012-04-17 48 views
0

我正在建立一个课程申请系统。高中,本科和研究生都可以申请这门课程。他们必须填写一些申请表格。Rails:处理几个相似的模型类?

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

那么我该如何处理呢?制作一张大桌子,但是让高中生的'GPA'专栏留空?或者使用三个单独的表?

此外,存在Student之间的一些关系(或者,在三个表的情况下,HighSchoolStudentUndergraduateStudentGraduateStudent)等模式。例如,Course有很多Student s,Student有很多Question s等等。

回答

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的属性。

0

您可以使用您想要的离开GPA为空的选项,并为该模型设置自定义验证,以便仅根据学生类型进行检查。单表继承也是一种选择,您可以在数据库表的列中指定不同的类名称,然后只需将这些类添加到模型目录中。你可以在这里看到一些文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html

我以前没有试过STI,但是考虑到你上面提到的内容,我可能会选择那条路线,从我的代码分支出去,看看它是如何泛滥的。