您可以对其进行设置,以便用户与学校、分支机构或地区具有多态关联。如果此关联为零,则意味着用户可以访问所有内容(您提到的国家级别)。
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 使用特定范围。为此,您应该能够scope_to
在您的ActiveAdmin.register
街区内度过难关。你必须做一点魔法才能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 的信息,请参阅此或此。