这是我的能力定义:
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可以这样做?
答案 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问题页面上发布了这个。