Мне нужно что-то вроде наследования Scope в pundit. Представьте себе этот scenarion:Наследование наследования на основе Pundit
class ApplicationPolicy
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope.where(:company => user.companies)
end
end
end
Теперь любая политика, унаследованная от ApplicationPolicy
имеет область, и я могу использовать его через policy_scope
. Это хорошо, потому что у меня мало моделей belongs_to :company
с такими же правилами определения области.
Но что, если мне нужна другая область для другой политики? Ok:
class DeviceGroupPolicy < ApplicationPolicy
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope.joins(:devices).where("devices.company_id in (?)", user.companies.map{|c| c.id}).group("device_groups.title")
end
end
end
Обратите внимание, что единственное различие в этом Scope
классе в resolve
методе.
Как можно использовать один и тот же класс Scope
от ApplicationPolicy
в других политических форматах без копирования-вставки этого шаблона?
расширить 'ApplicationPolicy' класс ' '' класса DeviceGroupPolicy
itsnikolay
Не работает. Метод 'resolve' объявляется внутри вложенного класса Scope, а не класса' ApplicationPolicy' –