2012-04-23 3 views
2

誰かがこのコードを説明してもらえますか?これはgothubの で説明したのと同じブログアプリですが、この部分の使用を特に理解できませんでした。マスク。Rails 3.0:cancanのロールは、ブログアプリケーションのuser.rbに定義されています

この管理者、モデレータ、作成者には3つの役割があります。 CRUD機能に基づいて、コメントを編集したり、コメントを削除したりすることができます。

  class User < ActiveRecord::Base 
        acts_as_authentic 
        has_many :articles 
        has_many :comments 

        named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} } 

        ROLES = %w[admin moderator author] 

        def roles=(roles) 
        self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum 
        end 

        def roles 
        ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? } 
        end 

        def role_symbols 
        roles.map(&:to_sym) 
        end 
       end 

答えて

2

role_maskはビットフィールドです。役割がUserに割り当てられるたびに、role_maskが自動的に更新されます。ロールマスクとそれぞれのロールに使用できる値は次のとおりです。

111: author, moderator, admin 
110: author, moderator 
101: author, admin 
100: author 
011: moderator, admin 
010: moderator 
001: admin 

ビットフィールドは、特定の役割を持つユーザーのデータベースをすばやく検索するために使用されます。これは、role_mask&演算子を適用して、探している役割のビットフィールドを使用して行います。たとえば、作成者であるすべてのユーザーを取得する場合、with_roleスコープは、roles_mask & 100がtrueのすべてのレコードのデータベースクエリを実行します。

0

cancanでのビットマスクの操作を簡単にするための宝がありますrole_model。ビットマスクの仕組みを理解し、決して役割を削除したり、役割の順序を変更したりしないでください。新しい役割を追加するには、それを最後の役割として追加します。

cancan wikiには、他のソリューションと同様にいくつかの情報があります。

関連する問題