我建议对您的访问级别使用按位值。这是有效的,因为您的角色数量有限,而且您的用户可以同时拥有多个角色。
与使用外部 gem 相比,它的维护速度更快、更容易。
想法是为每个访问级别使用一个数值,可以在位级别累积。
Level | Int val | Bit val
user | 1 | 00000001
moderator | 2 | 00000010
admin | 4 | 00000100
another | 8 | 00001000
etc ... | 16 | 00010000
因此,用户和版主的访问级别为 1 + 2 = 3(位 00000011)。然后我们可以测试bit值来定义用户access_level
1) 在你的用户模型中添加一个access_level 列,类型为整数,默认为 0
2) 设置常量来定义您的访问级别值
class User < ActiveRecord::Base
USER = 1
MODERATOR = 2
ADMIN = 4
end
3) 创建add_access_level 和remove_access_level 方法
class User < ActiveRecord::Base
# Add the desired bit
def add_access_level(level)
self.access_level |= level
end
# Removed the desired bit
def remove_access_level(level)
self.access_level &= ~level
end
end
注意:由您决定将这些更改保留在数据库中
4) 创建is_user?、is_moderator? 和is_admin? 方法
class User < ActiveRecord::Base
def is_user?
is_access_level? USER
end
def is_moderator?
is_access_level? MODERATOR
end
def is_admin?
is_access_level? ADMIN
end
private
def is_access_level?(level)
self.access_level & level == level
end
end
注意:我会使用method_missing,但这超出了我们的范围。
5) 测试一下
u = User.new
u.is_admin?
=> false
u.is_moderator?
=> false
u.is_user?
=> false
u.add_access_level User::USER
u.add_access_level User::MODERATOR
u.is_admin?
=> false
u.is_moderator?
=> true
u.is_user?
=> true
u.remove_access_level User::MODERATOR
u.is_admin?
=> false
u.is_moderator?
=> false
u.is_user?
=> true