Ruby on rails 3 Rails 3.0:blog应用程序的user.rb中定义的cancan角色

Ruby on rails 3 Rails 3.0:blog应用程序的user.rb中定义的cancan角色,ruby-on-rails-3,Ruby On Rails 3,有人能解释一下这个代码吗,这是解释过的同一个博客应用程序 在github上,但我无法理解这部分的用法,特别是名称空间角色掩码的用法 此应用程序中有三个角色:管理员、版主和作者。 基于CRUD功能,他们可以编辑注释或删除注释 class User < ActiveRecord::Base acts_as_authentic has_many :articles has

有人能解释一下这个代码吗,这是解释过的同一个博客应用程序 在github上,但我无法理解这部分的用法,特别是名称空间角色掩码的用法

此应用程序中有三个角色:管理员、版主和作者。 基于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
class用户“角色{u掩码&{2**roles.index(role.to_s)}>0”}
角色=%w[管理员-版主-作者]
def角色=(角色)
self.roles_mask=(roles&roles).map{r | 2**roles.index(r)}.sum
结束
def角色
ROLES.reject{| r |((ROLES|u mask | 0)&2**ROLES.index(r)).zero}
结束
定义角色符号
角色映射(&:to_sym)
结束
结束

角色掩码是一个位字段。只要将角色分配给
用户
,就会自动更新
角色掩码
。角色掩码和相应角色的可能值:

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

位字段用于快速搜索数据库中具有特定角色的用户。这是通过将
角色掩码
上的
运算符与您要查找的角色的位字段一起应用来完成的。例如,为了获得所有作者用户,带有角色的
作用域对所有记录执行数据库查询,其中
角色的
为真。

有一个gem可以使在cancan中使用位掩码更容易。只需了解如何使用位掩码,不要删除角色,也不要更改角色的顺序。要添加新角色,请将其添加为最后一个角色

坎坎会议有一些信息以及其他解决方案