RAILS用户层次结构;班级,协会。多态?

时间:2012-01-25 17:12:00

标签: ruby-on-rails ruby-on-rails-3 rails-models

我很惊讶仍然难以找到一个明确的答案:看起来很常见,我必须把它看错了。

我们有用户,他们的授权角色是这样的     ROLES =%w [管理员主持人老师学生被禁止]

通常建议使用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)将无法正常工作。此外,还有我们想要的共同属性,这是用户模型的全部要点:

User
  username:string
  email:string
  password:string
  role:string

由于没有User表,因此没有共同属性?

其他各种答案暗示使用:polymorphic => true:class_name => 'User'as:,但所有解释更像是为帖子和图片添加评论。这似乎不是一个很好的平行。

我似乎记得至少有一种语言(也许是一对OODB)只使用IS-A关系来继承属性。

什么是RAILS方式?

1 个答案:

答案 0 :(得分: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