Ruby on rails 3 Rails 3.0:blog应用程序的user.rb中定义的cancan角色
有人能解释一下这个代码吗,这是解释过的同一个博客应用程序 在github上,但我无法理解这部分的用法,特别是名称空间角色掩码的用法 此应用程序中有三个角色:管理员、版主和作者。 基于CRUD功能,他们可以编辑注释或删除注释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
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中使用位掩码更容易。只需了解如何使用位掩码,不要删除角色,也不要更改角色的顺序。要添加新角色,请将其添加为最后一个角色
坎坎会议有一些信息以及其他解决方案