是否可以进行多角色检查 - user.has_role?(:admin, :moderator)
...希望对数据库进行一次查询,而不是进行user.has_role?(:admin) && user.has_role?
(:moderator),这显然涉及两次访问数据库。
问问题
761 次
2 回答
2
不,现在你不能通过这样的选择。
user.has_role?(:admin, :moderator)
如果您想避免执行多个查询,您可以执行类似的操作
(user.roles & [:admin, :moderator]).present?
于 2014-03-01T00:28:39.310 回答
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
于 2014-03-04T00:36:02.157 回答