2

誰かがこのコードを説明してもらえますか?これはgithubで説明されているのと同じブログアプリですが、この部分の使用、特に名前空間の役割マスクの使用を理解できませんでした。

このアプリの管理者、モデレーター、作成者には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
4

2 に答える 2

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たとえば、作成者であるすべてのユーザーを取得するために、スコープは、 truewith_roleであるすべてのレコードに対してデータベースクエリを実行します 。roles_mask & 100

于 2012-07-10T07:37:08.967 に答える
0

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

cancan wikiには、他の解決策だけでなく、いくつかの情報があります。

于 2012-07-13T08:53:32.020 に答える