3

我有一个使用声明性授权运行的 ruby​​ 应用程序,并且我已经创建了角色:

admin(应用管理员) org_admin(组织管理员) org_colab(组织合作者) org_visitor(组织访问者)

用户可以拥有多个组织,他可以是管理员或合作者。

我使用从属关系表链接它们

解决这种多对多角色的最佳策略是什么?

在 Affiliation 表上添加一个额外的属性?比如:附属(:user_id:整数,:organization_id:整数,:affiliation_type:整数)

org_admin 的隶属关系类型可以是 0,org_colab 的隶属关系类型可以是 1,org_visitor 的隶属关系类型可以是 2?

我想必须有更好的方法来为特定组织分配角色......

4

2 回答 2

2

这是经典的“用户-组-角色”模型。是三元关系。用户组是多对多的;组角色也是如此。您将需要五个表来捕获所有内容。

您将从一个用户表开始。它会有一个主键(当然)。与组和角色相同。

您将在 E/R 图中的 User 和 Group 表之间有一个 UserGroup 表。UserGroup 将有两列:user_id 和 group_id。主键将是组合 (user_id, group_id)。user_id 列将与 User 表的主键有外键关系。group_id 列和 Group 表也是如此。

Group 和 Role 也会有类似的安排。每个都有一个主键。GroupRole 表将位于 E/R 图中的两者之间。重复上面的措辞,你就会拥有它。

我会创建一个 E/R 图来向您展示,但我正忙于做其他事情。我希望这对你来说已经足够了。如果没有,也许我稍后会添加它。

所以用户没有角色;团体可以。您将用户添加到组中,该用户将获得该组拥有的所有权限。这样,您可以为特定组添加特定角色(例如,管理员组的管理员权限)。然后添加到该组的每个人都将获得这些权限。

于 2010-03-10T00:58:29.237 回答
1

我实际上实现了类似于我的项目的东西。为了澄清我的理解是否正确 - 您的用户可能在整个应用程序上下文中扮演角色,以及在组织上下文中可能不依赖于彼此的特定角色。

一个务实的解决方案可能是实现两个不同的角色集。让我们考虑以下结构:您有一个用户模型(具有应用程序范围的信息)、一个组织模型(定义一个组织并且可能由用户拥有)和一个协作模型,它定义了一个用户和组织。

在这种情况下,最好将角色存储在用户模型(执行应用程序范围的工作)中,并将特定于组织的角色存储在协作模型中。

我在模型中使用了基于字符串的角色存储,并与 ryan bates cancan-gem 结合使用——它易于使用且快速,并将角色逻辑放在定义的位置。

这可能不适用于数千个不同的角色和组以及其他东西,在这种情况下,您应该在额外的模型中实现角色存储(与用户和协作具有多态关系)。

最良好的祝愿 - 弗洛里安

编辑:要使 ActiveRecord 可搜索该实现,您可能希望对 :roles-field 使用“序列化”功能,如 ActiveRecord::Base 中所述。

于 2010-08-27T08:45:23.223 回答