在Rails 5中为不同组分配用户角色的最佳方法?

时间:2016-06-22 15:54:36

标签: ruby-on-rails-5

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

组模型

    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,并为其指定字符串值“owner”,“manager”或“general”。 [衰]

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

  3. 创建一个{1}模型/表,其中包含1列(“名称”)和3行(“所有者”,“经理”,“常规”),然后更新我的模型:

  4. 角色模型

    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
    
    1. 直接在组模型上为各种角色创建单独的数组。这看起来真的很愚蠢,因为更新角色需要推送和拼接多个数组,我必须连接多个数组以提供一个简单的成员列表。
    2. 组模型

          class Membership < ApplicationRecord
            belongs_to :group
            belongs_to :user
            belongs_to :role
          end
      

      用户模型

          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
      

      我知道有像CanCanCan(Rails 5兼容?)和Groupify那样的宝石,但我想先了解我的所有选择。我认为选项#3可能是我最好的,至少没有使用宝石。想知道社区认为我的方案最佳实践。

1 个答案:

答案 0 :(得分:1)

<强>更新

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

对于Membership模型,我利用了活动记录枚举。由于枚举数组只保存两个值,因此简单地将“manager”布尔值添加到成员资格模型实际上会更有效。 True表示经理,false表示一般。但是我采用了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