ruby-on-rails - RAILS 用户层次结构;类(class)、社团。多态?

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

我很惊讶仍然很难找到一个明确的答案:这似乎很常见,我一定是看错了。

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

相关文章:

ruby-on-rails - 使用 @blog.user.followers.build 的未初始化常量 User::relationship

ruby-on-rails - 如何在命名范围内有多个条件?

ruby-on-rails - Rails - 如何将一个模型中的值调用到另一个模型中

ruby-on-rails - 如何从浮点输入中去除逗号?

ruby-on-rails - 迁移不适用于 Heroku

ruby-on-rails - 如何使用 domain.name 设置 'config.action_mailer.default_url_options' 的值?

ruby-on-rails - 助手 “fields_for”无法正常工作

mysql - Rails 中日期查询不返回边界日期数据

ruby-on-rails - 如何传递 ransack 参数 [ :q] object to another method in rails

ruby-on-rails - Rails 资源路径中的 CSS 在开发过程中未被 ERB 处理