2016-07-28 54 views
0

我遇到了一个问题,与轨道cancancan管理关系的Rails

gem 'cancancan', '~> 1.10' 

的cancancan宝石,我有四个型号:用户,公司,地点,团体

用户:属于公司 公司:有许多地方 地点:属于公司 组:属于位置

在能力模型,我有这样的:

can :manage, Group, :location => {:id => user.company.locations.map{|l| l.id}} 

当创建我否认新组(用不上)

我正在寻找正确的方式允许用户创建一组与公司所在地的id(注一:无cancancan在这一切作品和所有ID是相关的等)。

回答

1

为了确保我理解你的问题完全...

你正在寻找一种方式来限制用户的管理基础上的公司,用户所属的位置组的能力?

假设我有一个正确的,我会建议使用#pluck

can :manage, Group, location_id: user.company.locations.pluck(:id) 

此收集关于用户的公司的位置所有:id的,并确保用户只能管理有一个团体:该集合中包含的location_id。

功能,这等同于你做了什么,但在两个方面更为有效:

  1. 它不涉及任何不必要的Ruby逻辑

  2. 使用#pluck只查询上的某个位置:id,而不是整个位置其所有属性

一般而言,无论何时在Rails中访问数据库时,最好完全使用ActiveRecord方法。这将有助于防止浪费时间查询不需要的额外信息,并消除使用Ruby重新构建数据的额外开销。

希望有帮助!

+0

谢谢!你的使用采摘的建议正是我一直在寻找的!但是我仍然无法创建一个组。尝试创建时,它会向我显示我无权访问该资源。 – gregwinn

+0

嗯......只是为了仔细检查,您正尝试为属于您的用户帐户所属的公司的位置创建一个组,对吗? 因为如果cancancan设置正确,那么只有在公司的位置集合中存在location_id时才能创建组。如果您尝试创建的群组没有必要的location_id,它*应该*拒绝您。 – H12

+0

正确,我在下面包含更多细节: def group_params params。要求(:组).permit(:姓名,:LOCATION_ID) 端 创建方法: @ group.create(group_params).save PARAMS在dev的日志发送: ' “基团”=> { “name”=>“Test”},“button”=>“”,“location_id”=>“1”}' – gregwinn