“cancan”宝石过程如何深度嵌套资源能力?

时间:2013-04-02 04:07:10

标签: sql ruby-on-rails cancan

这是我的能力定义:

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中的所有订单

我在这里找到了一个关于此主题的话题:[CanCan深度嵌套资源 但是当在cancan中使用block define时,你不能使用accessible_by(current_ability)加载资源! 并且您可以使用Order.joins(:store => :business_district).where("district_manager_id = ?",current_user.id)加载我想要的内容!有没有什么方法cancan gem可以这样做?

1 个答案:

答案 0 :(得分:0)

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


也许你现在已经想到了这一点,但是对于其他任何可能在此之前停留的人在github上搜索CanCan的问题页面之前......

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

从CanCan 1.6.9开始,此变更集未合并,因此现在必须使用主分支。尽管如此,变更集引入了另一个我可以告诉的错误,即使在非嵌套的情况下,它也不能用于2条件能力定义。例如,我发现以下(我使用您的模型进行命名...)失败:

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

而以下是可以的:

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

我还在GitHub问题页面上发布了这个。