2

有人可以解释一下这段代码吗,这是在 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
4

2 回答 2

2

role_mask一个位域。每当将角色分配给 时Userrole_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

于 2012-07-10T07:37:08.967 回答
0

有一个 gem 可以让在 cancan 中使用位掩码更容易role_model。只需了解位掩码的方式,切勿删除角色,或更改角色的顺序。要添加新角色,请将其添加为最后一个角色。

cancan wiki有一些信息,以及其他解决方案。

于 2012-07-13T08:53:32.020 回答