使用rolify进行多角色检查

时间:2014-03-01 00:05:39

标签: ruby-on-rails rolify

是否可以进行多角色检查 - user.has_role?(:admin, :moderator) ...希望对数据库进行一次查询而不是执行user.has_role?(:admin) && user.has_role?(:主持人),这显然需要两次进入数据库。 / p>

https://github.com/EppO/rolify/issues/234

2 个答案:

答案 0 :(得分:2)

不,现在你无法通过这些选择。

user.has_role?(:admin, :moderator)

如果您想避免执行多个查询,可以执行类似

的操作
(user.roles & [:admin, :moderator]).present?

答案 1 :(得分:1)

rolify有has_any_role?has_all_roles?方法可以很容易地执行此操作。 has_any_role?只能访问数据库一次,但是has_all_roles?看起来像是在调用has_role?的参数上进行迭代,这样就无法完全解决您多次点击数据库的问题(它会在它击中了第一个负面结果,这比没有好。)

在我看来,您可以检查用户是否在一个查询中同时拥有两个角色:

user.roles.where("name IN (?, ?)", "admin", "moderator").size > 1

如果用户可以在不同的资源上拥有相同的角色,那么这不起作用,但是你明白了。另一个问题是它难以对您检查的角色数进行编码。你可以通过构造参数列表并使用send来解决这个问题,但它会有点难看。或者,如果您知道要检查的值是安全的,则可以将它们放在一个数组中并执行:

roles_to_check = ["admin", "moderator"]
user.roles.where(name: roles_to_check).size >= roles_to_check.size