2016-06-22 6 views
1

Hier sind die Basismodelle ohne Rollen:Der beste Ansatz für die Zuweisung von Benutzerrollen für verschiedene Gruppen in Rails 5?

Gruppenmodell

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

Benutzermodell

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

Mitgliedschaften Modell

class Membership < ApplicationRecord 
     belongs_to :group 
     belongs_to :user 
    end 

Jede Gruppe 1 haben sollte (und nur eine) owner, mehrfach admins (vom Eigentümer zugewiesen), und der Rest general Mitglieder. Außerdem muss die Besitzerrolle übertragbar sein. Meine Optionen, wie ich sehe sie:

  1. ein Attribut Einzel erstellen role auf der Mitgliedschaft Tabelle und weisen Sie einen String-Wert von „Eigentümer“, „Manager“ oder „allgemein“. [schlecht]

  2. Erstellen Sie mehrere boolesche Werte für "Besitzer", "Manager" und "allgemein" in der Mitgliedschaftstabelle. [Schlecht]

  3. erstellen Role Modell/Tabelle mit 1 Spalte ("name") und 3 Zeilen ("Eigentümer", "manager", "Allgemein"), dann meine Modelle aktualisieren, wie so:

Vorbild

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

Gruppenmodell

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

Benutzermodell

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

Mitgliedschaften Modell

class Membership < ApplicationRecord 
     belongs_to :group 
     belongs_to :user 
     belongs_to :role 
    end 
  1. Erstellen Sie separate Arrays für die verschiedenen Rollen direkt auf dem Gruppenmodell. Dies scheint wirklich dumm zu sein, da das Aktualisieren einer Rolle das Schieben und Spleißen mehrerer Arrays erfordern würde, und ich würde mehrere Arrays verketten müssen, um eine einfache Liste von Mitgliedschaften zu präsentieren.

Gruppenmodell

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 

Benutzermodell

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 

Mitgliedschaften Modell

class Membership < ApplicationRecord 
     belongs_to :group 
     belongs_to :user 
    end 

Ich weiß, es gibt Edelsteine ​​heraus dort wie CanCanCan (Rails 5 kompatibel?) Und Groupify , aber ich möchte zuerst alle meine Möglichkeiten verstehen. Ich denke, Option 3 ist wahrscheinlich mein bestes, zumindest ohne ohne einen Edelstein zu benutzen. Ich frage mich, was die Community als beste Praxis für mein Szenario betrachtet.

+0

etwas gefunden? –

+0

Siehe meine Antwort unter – MattD

Antwort

1

UPDATE

Ich landete mit folgenden Lösung ging und habe in einer Produktions App mit ihm sehr zufrieden. Da eine Gruppe nur einen Eigentümer haben kann, wurde seit dieser Zeit eine so genannte "ansons_to" -Beziehung verwendet.

Für das Mitgliedschaftsmodell nutzte ich die aktive Datensatzauflistung. Da das Enumerationsfeld nur zwei Werte enthält, wäre es tatsächlich effizienter gewesen, einfach einen booleschen "manager" -Boolean zum Mitgliedschaftsmodell hinzuzufügen. Wahr bedeutet Manager, falsch bedeutet allgemein. Aber ich ging mit dem Enum-Ansatz, weil ich erwarte, dass in naher Zukunft zusätzliche Rollen benötigt werden, und mit enum werden sie SEHR einfach hinzuzufügen sein.

Gruppenmodell

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

Benutzermodell

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

Mitgliedschaft Modell

class Membership < ApplicationRecord 
     belongs_to :group 
     belongs_to :user 

     enum role: [:general, :manager] 
    end 
+0

Nun, hört sich gut an, es ist Ihre Frage und Ihre Lösung, diese Antwort erhalten Sie (Y) –

Verwandte Themen