0

我正在构建一个课程应用系统。高中生、本科生和研究生都可以申请该课程。他们必须填写一些申请表。

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

那么我应该如何处理呢?制作一张大表,但将高中生的“GPA”列留空?还是使用三个单独的表?

Student此外, (或者,在三个表的情况下HighSchoolStudentUndergraduateStudentGraduateStudent)与其他模型之间存在一些关系。例如,Course有很多Students,Student有很多Questions,等等。

4

2 回答 2

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

于 2012-04-17T18:16:10.717 回答
0

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

我以前没有尝试过 STI,但鉴于你上面所说的,我可能会走这条路,分支我的代码,看看它是如何成功的。

于 2012-04-17T18:01:13.637 回答