Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 比较两个数据集,以确保管理员只能编辑其所在区域的用户_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 比较两个数据集,以确保管理员只能编辑其所在区域的用户

Ruby on rails 比较两个数据集,以确保管理员只能编辑其所在区域的用户,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我创建了一个应用程序,用户有许多区域(通过订阅)。一些用户具有:admin角色,这些用户还具有许多管理区域(通过管理。我正在努力寻找最好的方法,以确保给定区域A的管理员进入用户索引页,他们只能看到区域A中的其他用户,而不能看到该区域以外的其他用户。我的模型设置如下: class User < ActiveRecord::Base has_many :subscriptions has_many :areas, through: :subscriptions has_many

我创建了一个应用程序,
用户
有许多
区域
(通过
订阅
)。一些
用户
具有
:admin
角色,这些用户还具有许多
管理区域
(通过
管理
。我正在努力寻找最好的方法,以确保给定区域A的管理员进入用户索引页,他们只能看到区域A中的其他用户,而不能看到该区域以外的其他用户。我的模型设置如下:

class User < ActiveRecord::Base
  has_many :subscriptions
  has_many :areas, through: :subscriptions

  has_many :administrations
  has_many :administrative_areas, through: :administrations, :source => :area, :class_name => "Area"
end

class Area < ActiveRecord::Base      
  has_many :subscriptions
  has_many :users, :through => :subscriptions

  has_many :administrations
  has_many :admins, :through => :administrations, :class_name => "User", :source => :user
end
class用户:area,:class\u name=>“area”
结束
类区域:订阅
你有很多:行政部门
有许多:管理员,:通过=>:administrations,:class\u name=>“User”,:source=>:User
结束
我可以成功地设置用户/管理员,但我正在努力获得正确的ActiveRecord查询,以便只返回管理员的相关用户

有没有解决这个问题的想法,或者有没有更好的方法的建议


谢谢!

假设
@admin\u user
是某个具有管理员角色的用户

  @admin_areas = User.joins(:subscriptions).where('subscriptions.area_id' => @admin_user.administrative_areas.map(&:id))
您可以使用gem来管理角色,并为不同的角色提供控制

编辑:您可以尝试以下方法

在user.rb中

scope :users_to_manage, lambda{ joins(:subscriptions).where('subscriptions.area_id' => current_user.administrative_areas.map(&:id)) #if you have access current_user in model
在ability.rb中

can :manage, Area.users_to_manage

我已经在使用cancan gem了,你能不能给我更多的建议,告诉我如何配置它来实现我上面的目标?目前,如果user.have_role?:admin他们可以简单地:manage:all,这感觉很粗糙!对……如果我把它改成
@admin_Area=Area.where(:id=>@admin_user.administrative_Area.map(&:id))就行了
但是现在有没有一种简单的方法可以在一行AR查询中返回这些区域的所有用户?谢谢!好的,我会编辑它。最好在模型中定义
范围,然后在定义角色的地方使用该范围。我也非常乐意采用这种方法。对不起,
用户加入(:订阅)。其中(“订阅.区域\u id”=>当前用户.管理区.地图(&:id))