2013-11-04 14 views

risposta

6

Lasciami confondere l'acqua un po '. Preferisco questo tramite una tabella e una tabella join UserRole. In questo modo posso definire più di un ruolo senza aggiungere un'altra colonna/tabella a db.

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

Mi piace concettualmente questo dato che aggiunge molta flessibilità se necessario. Ovviamente, tuttavia, aggiunge complessità ... –

+0

Quindi, in teoria, quando si utilizza questo approccio è possibile combinare ruoli incompatibili, ho ragione? – DreamWalker

4

Dipende davvero da cosa si desidera fare con il ruolo di amministratore. La prima opzione, direi, è un po 'sicura in quanto il ruolo di amministratore è un modello unico in sé.

La seconda opzione è semplice e ti aiuterà ad andare con il minimo sforzo. Tuttavia, se i tuoi utenti calcolano la variabile booleana e un modo per impostarla, qualsiasi utente può diventare un amministratore e accedere alle aree che non desideri.

Problemi correlati