1

这是我的能力定义:

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 有什么办法可以做到这一点吗?

4

1 回答 1

0

更新(5 月 28 日): 添加深度嵌套资源功能的拉取请求包含在 1.6.10 版本中。GitHub 上还修复了下面描述的 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 问题页面上发布了关于此的内容。

于 2013-04-29T00:35:54.503 回答