我应该怎么做才能在RoR中建立多态关系?

时间:2010-07-10 03:45:37

标签: ruby-on-rails polymorphism

我有一个用户表,并有一个角色列,用于标识他们的角色。现在,我想添加一个“学生”表,其中包含学生的学号,我还想添加一个“教师”来存储教师的工资。

学生和教师都是用户的子类。现在,我在User表中添加了一个角色列,“T”= Teacher,“S”= Student。现在,我想在数据库中添加“Student”和“Teacher”。我该怎么办?仅生成支架或迁移?还有,有必要修改我的模型吗?或者我只需要修改控制器??

谢谢。

2 个答案:

答案 0 :(得分:1)

这听起来更像是Rails单表继承的工作。它真的很容易使用。而不是使用单独的表来存储角色。从User继承您的学生和教师模型。 例如:

User < ActiveRecord::Base; ... end
Student < User; ... end
Teacher < User; ... end

Rails会自动创建一个类型列并将类存储在那里。 User.all将返回所有用户Student.all将返回类型匹配的用户学生和Teacher.all将对所有教师执行相同操作。

您可以在ActiveRecord documentationhere了解有关单表继承的更多信息。

答案 1 :(得分:0)

正如nuclearsandwich所说,这是一种需要rails STI(单表继承)的情况,而不是多态关联。

只是为了强调差异:
1)当您具有彼此非常相似且具有微小差异的不同模型时,使用单个表继承。 STI将所有模型归为同一数据库表,其中包含使用此表的所有模型的字段(列)。还有一个“类型”字段,表示该记录属于哪个模型 您的案例是STI的完美范例。您拥有用户,学生和教师模型,他们共享许多常见的字段和功能,您只需要为学生和教师提供额外的字段。

2)当您拥有与不同模型相关联的模型时,将使用多态关联。例如,假设您有一个“地址”模型。您还有一个“公司”和“用户”模型,两者都可以有一个地址 在地址模型中,您可以指定

belongs_to :user
belongs_to :company

然后确保该地址属于公司不要调用address.user,反之亦然。但是,更好的方法是通过多态关联。在您的地址模型中,您可以

belongs_to :addressable, :polymorphic => true

并在您的用户和公司模型中添加

has_one :address, :as => :addressable

这允许地址模型多态(字面意思:转换为多个)其关联,并通过单个关联与多个不同的模型连接。