ruby-on-rails - 依赖于角色的关联

标签 ruby-on-rails ruby database database-design activerecord

我正在一家公司开发我的第一个真正的 Rails 应用程序,用于时间跟踪,我遇到了数据库/模型设计问题。我的应用程序有一个用户模型和一个角色模型,它们通过 has_and_belongs_to_many 关联链接在一起。

其中一个角色是经理。一个经理可以有很多助理,而助理可以有很多经理(尽管通常只有一个)。这种关系通过用户模型中的 manager_assistant_relationship 表示为:

has_many :assistants, :through => :manager_assistant_relationships
has_many :managers, :through => :manager_assistant_relationships

助理可以有多个类次(代表一个工作类次的不同模型),而经理可以有多个客户(另一种模型将为助理的工作付费)。更多协会即将到来。

据我所知,唯一的解决方案是将所有这些关系放在用户模型中,但感觉有些不对劲,随着角色的增加和关联的增加,用户模型可能会变得臃肿,而且看起来也不直观,因为如果用户是经理,则他只有很多助手。我想要一些关于这种方法的潜在陷阱以及我应该考虑哪些替代方案的建议。

将用户模型子类化为角色是个好主意吗?

最佳答案

好消息,您对角色的处理是正确的。

要回答您的问题,为您描述的内容子类化用户模型不是一个好主意。如果这样做,它往往会导致关联的棘手自连接,或 STI(单表继承),或继承或类而不是模块组合。使用角色要好得多。

这可能有助于您将用户视为一个人,而不是一个角色。所以 User 类只包含个人信息,例如姓名、生日、高度,可能还有电子邮件地址、登录密码等。将个人信息与时间跟踪角色分开。

要使用您的角色,您可以像这样伪代码建立模型关系:

 class Manager
   has_many :clients
 end

 manager = Manager.find(id)
 client = manager.clients.first

或者像这样的伪代码:

 class Assistant
   has_many :workshifts
 end

 assistant = Assistant.find(id)
 workshift = assistant.workshifts

喜欢使用角色的其他充分理由是 Role-Based Access Control (RBAC)Data Context Interation (DCI)如果您想阅读这些内容。

关于ruby-on-rails - 依赖于角色的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521031/

相关文章:

ruby-on-rails - 哪些 ERP 具有像样的 Ruby 连接器或完整的 API?

ruby - 将几个 Enumerables 变成一个

ruby - 在 ruby​​ 中为 selenium chrome 驱动程序设置代理

css - Bootstrap-sass : fieldset in bootstrap cannot be overriden

ruby-on-rails - 我可以在 date_select 辅助标签中显示(且仅)月份和年份吗?

ruby-on-rails - 在 Ruby on Rails 模型对象上执行 map 方法

c# - 连接数据库 C#

sql - 作为 Postgres 中另一个函数的参数的函数

简单的两个表连接查询的 MySQL 性能问题

ruby-on-rails - 通过 Capybara (v2) 与 Bootstrap 模态交互时出现问题