Мне нужно что-то вроде наследования Scope в 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
с точно такими же правилами области видимости.
Но что, если мне нужна другая область действия для другой политики? В порядке:
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
class ``` class DeviceGroupPolicy ‹ ApplicationPolicy def resolve scope.joins(:devices).where(devices: { company_id: @user.companies).group(device_groups.title) end end ``` - person itsnikolay   schedule 01.05.2015resolve
объявлен внутри вложенного классаScope
, а не самого классаApplicationPolicy
- person Oleg Antonyan   schedule 02.05.2015