2016-06-22 17 views
1

は、ここでの役割せずに基本的なモデルです。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(1つのみを持つべきです)owner、複数のadmins(オーナーが割り当てられます)、およびgeneralのメンバーです。また、所有権の役割は、である必要があります。私のオプション、私はそれらを見るように:

  1. メンバーシップのテーブルの上に単一の属性roleを作成し、それを「所有者」、「管理者」、または「一般」の文字列値を割り当てます。 [悪い]

  2. メンバーシップテーブルの "owner"、 "manager"、 "general"に複数のブール値を作成します。 [悪い]

  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 
  • 直接群モデルでさまざまな役割のために別々のアレイを作成します。役割を更新するには複数の配列のプッシュとスプライシングが必要になり、単純なメンバーシップのリストを提示するためには複数の配列を連結する必要があるため、これは本当に馬鹿げているようです。
  • グループモデル

    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は、少なくとも宝石を利用することなく、おそらく私の最高の最高だと思う。自分のシナリオでコミュニティがベストプラクティスと考えていることを思い出してください。

    +0

    は何を見つけましたか? –

    +0

    下の私の答えを参照してください – MattD

    答えて

    1

    UPDATE

    私は、次の解決策と一緒に行くことになったと生産アプリでそれに非常に満足しています。グループには所有者が1人しかいないため、そのロールにbelongs_to関係を使用してから作成しました。

    メンバーシップモデルでは、アクティブなレコード列挙型を利用しました。列挙型配列は2つの値しか保持しないため、メンバーシップモデルに単に「マネージャ」ブール値を追加するほうが効率的でした。真はマネージャ、偽は一般を意味します。しかし、近い将来に追加の役割が必要になると予想しており、列挙型を使用することで非常に簡単に追加できるので、私は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 
    
    +0

    良い、そのあなたの質問、あなたの解決策、この受け入れられた答え(Y) –

    関連する問題