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