所以我有一个应用程序,用户(设计)有能力看到所有,或主要模型的一个子集(在这种情况下学校),这取决于用户是否在分支机构,地区或国家层面。
Branch belongs_to Region
School belongs_to Branch
我想做的是能够以这样一种方式连接权限(可能有一个范围),以便对ActiveAdmin透明。用户登录到ActiveAdmin,然后显示一个只允许他们查看的学校列表。
所以我猜这可能是一个ActiveAdmin解决方案或更低层次的东西。
您可以设置它,以便用户具有与学校,分支机构或地区的多态关联。如果此关联为nil,则意味着用户可以访问所有内容(您提到的国家级别)。
class User < ActiveRecord::Base
belongs_to :administrates, :polymorphic => true
end
class School < ActiveRecord::Base
belongs_to :branch
has_many :users, :as => :administrates
end
class Branch < ActiveRecord::Base
belongs_to :region
has_many :schools
has_many :users, :as => :administrates
end
class Region < ActiveRecord::Base
has_many :branches
has_many :users, :as => :administrates
end
你不能让它对Active Admin完全透明,因为你必须告诉Active Admin使用特定的作用域。为此,您应该能够在ActiveAdmin.register
块中使用scope_to
。你必须做一个小魔术,使scope_to
工作与多态关联,但它是可行的:
ActiveAdmin.register School do
scope_to do
Class.new do
def self.schools
case current_user.administrates
when School
School.where(:id => current_user.administrates_id)
when Branch
School.where(:branch_id => current_user.administrates_id)
when Region
School.where(:branch_id => current_user.administrates.branches.map(&:id))
when NilClass
School.scoped
end
end
end
end
end
这基本上意味着每次Active Admin将加载一个学校(或索引页上的学校列表),它将通过我们在scope_to
块内创建的匿名类来确定它的范围。
您应该能够在Branch
和Region
模型上实现类似的东西,这取决于您的需求。
你应该意识到,当使用scope_to
时,关于过滤器和表单显示当前用户范围之外的资源,目前存在一个开放的问题。
您还需要授权来限制特定级别的用户只能看到该级别及以下的用户(例如,分支级别的用户不应该访问区域)。为此,您应该使用CanCan。
有关如何在Active Admin中集成CanCan的信息,请参阅此或此