【问题标题】:Multi-role check using rolify使用 rolify 进行多角色检查
【发布时间】:2014-03-04 08:57:33
【问题描述】:

是否可以进行多角色检查 - user.has_role?(:admin, :moderator) ...希望对 DB 进行一次查询,而不是在 user.has_role?(:admin) && user.has_role?(:moderator) 进行,这显然涉及到 DB 两次。

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

【问题讨论】:

    标签: ruby-on-rails rolify


    【解决方案1】:

    不,现在你不能传递这样的选项。

    user.has_role?(:admin, :moderator)
    

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-09
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 2012-06-06
        相关资源
        最近更新 更多