【问题标题】:Best approach for assigning user roles for different groups in Rails 5?在 Rails 5 中为不同组分配用户角色的最佳方法?
【发布时间】:2016-10-24 16:30:06
【问题描述】:

以下是没有角色的基本模型:

组模型

    class Group < ApplicationRecord
      has_many :memberships
      has_many :users, through :memberships
    end

用户模型

    class User < ApplicationRecord
      has_many :memberships
      has_many :groups, through :memberships
    end

会员模式

    class Membership < ApplicationRecord
      belongs_to :group
      belongs_to :user
    end

每个组应有 1 个(且只有一个)owner、多个admins(由所有者分配),其余为general 成员。此外,所有权角色需要可转让。在我看来,我的选择:

  1. 在成员表上创建单个属性role,并为其分配一个字符串值“所有者”、“经理”或“一般”。 [不好]

  2. 在成员资格表上为“所有者”、“经理”和“一般”创建多个布尔值。 [不好]

  3. 创建一个包含 1 列(“名称”)和 3 行(“所有者”、“经理”、“一般”)的 Role 模型/表,然后像这样更新我的模型:

榜样

    class Role < ApplicationRecord
      has_many :memberships
      has_many :users, through :memberships
      has_many :groups, through :memberships
    end

组模型

    class Group < ApplicationRecord
      has_many :memberships
      has_many :users, through :memberships
      has_many :roles, through :memberships
    end

用户模型

    class User < ApplicationRecord
      has_many :memberships
      has_many :groups, through :memberships
      has_many :roles, through :memberships
    end

会员模式

    class Membership < ApplicationRecord
      belongs_to :group
      belongs_to :user
      belongs_to :role
    end
  1. 直接在组模型上为各种角色创建单独的数组。这看起来真的很愚蠢,因为更新角色需要推送和拼接多个数组,而我必须连接多个数组以呈现一个简单的成员列表。

组模型

    class Group < ApplicationRecord
      has_many :general_memberships, class_name: 'Membership'
      has_many :admin_memberships, class_name: 'Membership'
      has_one :owner_membership, class_name: 'Membership'

      has_many :users, through :memberships
    end

用户模型

    class User < ApplicationRecord
      has_many :general_memberships, class_name: 'Membership'
      has_many :admin_memberships, class_name: 'Membership'
      has_many :owner_memberships, class_name: 'Membership'

      has_many :groups, through :memberships
    end

会员模式

    class Membership < ApplicationRecord
      belongs_to :group
      belongs_to :user
    end

我知道有像 CanCanCan(Rails 5 兼容?)和 Groupify 这样的宝石,但我想先了解我的所有选择。我认为选项#3 可能是我最好的,至少在不使用宝石的情况下。想知道社区认为我的方案的最佳做法是什么。

【问题讨论】:

  • 找到什么了吗?
  • 在下面查看我的答案

标签: ruby-on-rails-5


【解决方案1】:

更新

我最终采用了以下解决方案,并且在生产应用程序中对它非常满意。由于一个组只能有一个所有者,因此它为该角色使用了 belongs_to 关系。

对于会员模型,我利用了活动记录枚举。由于枚举数组只包含两个值,实际上将“经理”布尔值简单地添加到成员模型中会更有效。真意味着经理,假意味着将军。但我选择了 enum 方法,因为我预计在不久的将来需要额外的角色,并且使用 enum 将非常容易添加。

组模型

    class Group < ApplicationRecord
      belongs_to :owner, class_name: 'User'
      has_many :memberships
      has_many :users, through :memberships
    end

用户模型

    class User < ApplicationRecord
      has_many :owned_groups, class_name: 'Group', :foreign_key => 'owner_id'
      has_many :memberships
      has_many :groups, through :memberships
    end

会员模式

    class Membership < ApplicationRecord
      belongs_to :group
      belongs_to :user

      enum role: [:general, :manager]
    end

【讨论】:

  • 嗯,听起来不错,这是您的问题和您的解决方案,这是公认的答案 (Y)
  • 这应该是 Rails 5 gem。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2022-11-01
  • 2012-01-16
  • 2016-03-09
相关资源
最近更新 更多