gpt4 book ai didi

ruby-on-rails - 处理不同类型用户的最佳方式?

转载 作者:行者123 更新时间:2023-12-04 05:52:36 25 4
gpt4 key购买 nike

我有一个大型 Rails 应用程序,它通过单表继承拥有 34 种不同类型的用户。最初设计应用程序时,假设用户会根据类型有不同的行为。这个假设是错误的,所以我正在寻求重构。

问题是您将如何重构用户 STI?

  • 向用户添加大量 bool 属性(即 User#is_employee?User.is_contractor?)
  • User#type重命名为User#user_type,根据字段进行字符串匹配
  • 一些可怕的查找表解决方案
  • 我缺少的东西...

澄清一下,出于 ACL 的原因,用户需要一个“类型”,但对于 STI,它们实际上只是空模型,而 STI 会导致规范问题、一般性疼痛等。

最佳答案

听起来您真正需要的是角色而不是用户类型。我发现当您最终拥有多种用户类型时通常会出现这种情况,这是因为某些用户具有不止一种角色。

一个简单的ACL模型是:用户有很多角色,每个角色有很多权限。一个用户的权限集是该用户所属的所有角色的所有权限的集合。

在更复杂的情况下,权限通常是一个计算属性而不是数据库中的一行,原因很简单,权限有时是基于目标和时间的(!)。

@user.can_view_payroll_info_for?(@employee, 2.years.ago) ==> true
@user.can_view_payroll_info_for?(@employee, Time.now) ==> false

但大多数时候,角色的分辨率与您需要的分辨率一样高:

@john.has_role(:content_author) ==> true
@john.has_role(:moderator) ==> true

@benny.has_role(:content_author) ==> true
@benny.has_role(:moderator) ==> false

@michael.has_role(:moderator) ==> true
@michael.has_role(:content_author) ==> false

如果您希望对角色进行规范化,您可以将其简单地实现为用户的逗号分隔(已验证)字符串“角色”列或连接表。

关于ruby-on-rails - 处理不同类型用户的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com