ユーザーが学校、支部、または地域のいずれかにポリモーフィックな関連付けを持つように設定できます。この関連付けが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に特定のスコープを使用するように指示する必要があるため、ActiveAdminに対して完全に透過的にすることはできません。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をActiveAdminに統合する方法については、こちらまたはこちらをご覧ください。