我很惊讶仍然很难找到一个明确的答案:这似乎很常见,我一定是看错了。
我们有用户,他们的授权角色运行类似 ROLES = %w[admin moderator teacher student banned]
通常建议使用 ROLES 字段和单表继承(如 here )
class User < ActiveRecord::Base
end
class Student < User
end
class Teacher < User
end
但这会将所有数据放在一个表中。如果我们有大量针对每种用户类型的唯一数据怎么办?
student
year:integer
request_id:integer
portfolio_id:integer
status:string
...
teachers
user_id:integer
district:string
school:string
subject1:string
subject2:string
specialty:string
bio:text
...
STI 提供了诸如 student.specialty 和 teacher.portfolio_id 之类的东西,我们不希望这些东西被阻止。
Ruby Way 建议使用抽象基模型类来处理单独的表:
class User < ActiveRecord::Base
self.abstract = true
end
class Student < User
end
class Teacher < User
end
这将允许学生和教师使用唯一的表格。但是,他警告说,User.find(:all) 不会起作用。另外,还有我们想要的公共(public)属性,这是用户模型的全部要点:
User
username:string
email:string
password:string
role:string
既然没有User表,就没有公共(public)属性?
其他各种答案都暗示使用 :polymorphic => true
、:class_name => 'User'
或 as:
但都解释了更像是为帖子和图片添加评论。这似乎不是一个很好的平行。
我似乎记得至少有一种语言(可能还有一些 OODB 语言)只是使用 IS-A 关系来继承属性。
什么是 RAILS 方式?
最佳答案
我认为在这里做 STI 是错误的。您要处理的事情太多,可能会被塞到一张表中。
我宁愿做一个通用的用户模型,保存常见的东西,如电子邮件、姓名,并且每个用户类型都有一个单独的模型(和表)。所以,老师和学生会引用用户,但有自己的领域。
角色也应该在他们自己的表中,与用户分开。
像这样引用用户记录:
class Teacher < AR::Base
belongs_to :user
end
class Student < AR::Base
belongs_to :user
end
class User < AR::Base
has_one :teacher
has_one :student
end
关于ruby-on-rails - RAILS 用户层次结构;类(class)、社团。多态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9006918/