【发布时间】:2014-03-04 08:57:33
【问题描述】:
是否可以进行多角色检查 - user.has_role?(:admin, :moderator) ...希望对 DB 进行一次查询,而不是在 user.has_role?(:admin) && user.has_role?(:moderator) 进行,这显然涉及到 DB 两次。
【问题讨论】:
标签: ruby-on-rails rolify
是否可以进行多角色检查 - user.has_role?(:admin, :moderator) ...希望对 DB 进行一次查询,而不是在 user.has_role?(:admin) && user.has_role?(:moderator) 进行,这显然涉及到 DB 两次。
【问题讨论】:
标签: ruby-on-rails rolify
不,现在你不能传递这样的选项。
user.has_role?(:admin, :moderator)
如果您想避免执行多个查询,您可以执行类似的操作
(user.roles & [:admin, :moderator]).present?
【讨论】:
rolify 有 has_any_role? 和 has_all_roles? 方法,它们非常易读。 has_any_role? 只命中 DB 一次,但 has_all_roles? 看起来它会遍历调用 has_role? 的参数,因此这并不能完全解决您对多次命中 DB 的担忧(当它遇到第一个否定结果时它会停止,总比没有好)。
在我看来,您可以通过以下方式检查用户是否在一个查询中同时拥有两个角色:
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
【讨论】: