3

我很惊讶要找到一个明确的答案是多么困难:这似乎很普遍,以至于我一定看错了。

我们有用户,他们的授权角色运行类似于 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方式?

4

1 回答 1

0

我认为在这里做 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
于 2012-01-25T17:18:35.000 回答