【问题标题】:how "cancan" gem process depth nested resource ability?如何“cancan” gem 处理深度嵌套资源的能力?
【发布时间】:2013-03-23 06:16:56
【问题描述】:

这是我的能力定义:

can :manage,Order,:store => {:business_district => {:district_manager_id => user.id}}

当我通过以下方式加载资源时:

Order.accessible_by(current_ability)

它生成这样的 SQL:

SELECT COUNT(*) FROM `orders` INNER JOIN `stores` ON `stores`.`id` = `orders`.`store_id` INNER JOIN `business_districts` ON `business_districts`.`id` = `stores`.`business_district_id` WHERE (`stores`.`business_districts` = '---\n:district_manager_id: 37\n')

除了“where”中的代码外,sql 看起来都不错。 我不知道如何使它工作 这是模型关系

1. store belongs_to business_district
2. order belongs_to store
3. business_district has district_manager_id

我想查看 business_district 中的所有订单

我在so中找到了一个关于这个的话题:[CanCan深度嵌套资源 但是在cancan中使用块定义时,不能使用accessible_by(current_ability)加载资源! 你可以使用Order.joins(:store => :business_district).where("district_manager_id = ?",current_user.id)来加载我想要的! cancan gem 有什么办法可以做到这一点?

【问题讨论】:

    标签: sql ruby-on-rails cancan


    【解决方案1】:

    更新(5 月 28 日): 添加深度嵌套资源功能的拉取请求已包含在 1.6.10 版本中。 GitHub 上还有一个fix 用于下面描述的 SQL 条件错误。我相信它应该会进入下一个版本,因为它明显不匹配。


    也许你现在已经想通了,但是对于在 github 上搜索 CanCan 的问题页面之前可能会停下来的其他人......

    大约 2 个月前接受了一个拉取请求来解决这个问题。检查https://github.com/ryanb/cancan/pull/806

    从 CanCan 1.6.9 开始,这个变更集没有被合并,所以现在必须使用 master 分支。就目前而言,据我所知,变更集引入了另一个错误,即使在非嵌套情况下,它也无法定义 2 条件能力。例如,我发现以下(我正在使用您的模型进行命名...)失败:

    can :manage, Order,:store => {:district_manager_id => user.id, :condition2 => true}
    

    而以下是可以的:

    can :manage, Order,:store => {:district_manager_id => user.id }
    

    我也在 GitHub 问题页面上发布了关于此的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多