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:
ein Attribut Einzel erstellen
role
auf der Mitgliedschaft Tabelle und weisen Sie einen String-Wert von „Eigentümer“, „Manager“ oder „allgemein“. [schlecht]Erstellen Sie mehrere boolesche Werte für "Besitzer", "Manager" und "allgemein" in der Mitgliedschaftstabelle. [Schlecht]
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
- 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.
etwas gefunden? –
Siehe meine Antwort unter – MattD