2013-11-04 16 views

答えて

6

私は水を少し混乱させてください。私はRoleテーブルと結合テーブルUserRoleでこれを好む。このようにして、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

私はこれが概念的に好きです。なぜなら、それが必要な場合には、多くの柔軟性を追加するからです。これとは逆に、複雑さが増します。 –

+0

理論的には、このアプローチを使用すると互換性のない役割を組み合わせることはできますか? – DreamWalker

4

本当に管理者の役割で何をしたいかによって異なります。最初の選択肢は、管理者の役割はそれ自身が固有のモデルであるため、少し安全だと言います。

2番目のオプションは簡単で、最小限の労力で進化するのに役立ちます。しかし、ユーザーがブール変数とそれを設定する方法を見つけ出すと、どのユーザーも管理者になり、必要のないアクセス領域になる可能性があります。

関連する問題