Вы можете настроить его так, чтобы у пользователя была полиморфная ассоциация со школой, филиалом или регионом. Если эта ассоциация равна нулю, это будет означать, что пользователь имеет доступ ко всему (упомянутый вами национальный уровень).
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 .
Для получения информации о том, как интегрировать CanCan в Active Admin, см. this или this .