我很惊讶要找到一个明确的答案是多么困难:这似乎很普遍,以至于我一定看错了。
我们有用户,他们的授权角色运行类似于 ROLES = %w[管理员版主老师学生禁止]
通常建议使用 ROLES 字段和 Single Table Inheritance to (as 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) 将不起作用。另外,还有我们想要的共同属性,这是用户模型的重点:
User
username:string
email:string
password:string
role:string
既然没有 User 表,就没有共同的属性?
其他各种答案都暗示使用:polymorphic => true
,:class_name => 'User'
或 ,as:
但所有解释都更像是在帖子和图像中添加评论。这似乎不是一个很好的平行。
我似乎记得至少有一种语言(可能还有几种 OODB)只是使用 IS-A 关系来继承属性。
什么是RAILS方式?