2013-11-04 25 views

Antwort

6

Lassen Sie mich das Wasser ein wenig durcheinander bringen. Ich bevorzuge dies über eine Role Tabelle und eine Join Tabelle UserRole. Auf diese Weise kann ich mehr als eine Rolle definieren, ohne eine weitere Spalte/Tabelle zur db hinzuzufügen.

class User 
    has_many :user_roles 
    has_many :roles, :through => :user_roles 

    def role?(role) 
    role_names.include? role 
    end 

    def role_names 
    @role_names ||= self.roles.map(&:name) 
    end 

    def role=(role) 
    self.roles << Role.find_or_create_by_name(role) 
    end 
end 

class UserRole 
    # integer: user_id, integer: role_id 
    belongs_to :user 
    belongs_to :role 
end 

class Role 
    # string: name 
    has_many :user_roles 
    has_many :users, :through => :user_roles 
end 
+1

Ich mag dies konzeptionell, da es eine Menge Flexibilität hinzufügt, wenn das erforderlich ist. Umgekehrt natürlich, ist es aber Komplexität hinzufügt ... –

+0

Also, in der Theorie, wenn dieser Ansatz zu verwenden, können inkompatible Rollen kombiniert werden, habe ich recht? – DreamWalker

4

Es hängt wirklich davon ab, was Sie mit Ihrer Admin-Rolle machen möchten. Die erste Option, ich würde sagen, ist ein wenig sicher, da die Administratorrolle ein eigenständiges Modell ist.

Die zweite Option ist einfach und würde Ihnen helfen, mit der geringsten Anstrengung loszulegen. Wenn Ihre Benutzer jedoch die boolesche Variable und eine Möglichkeit finden, sie festzulegen, kann jeder Benutzer ein Administrator werden und auf Bereiche zugreifen, die er nicht haben soll.

Verwandte Themen