Наследование Pundit Scope

Мне нужно что-то вроде наследования 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 в других политиках, не копируя этот шаблонный код?


person Oleg Antonyan    schedule 01.05.2015    source источник
comment
extend 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.2015
comment
Не работает. Метод resolve объявлен внутри вложенного класса Scope, а не самого класса ApplicationPolicy   -  person Oleg Antonyan    schedule 02.05.2015


Ответы (1)


Ты можешь сделать это:

class DeviceGroupPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.joins(:devices).where("devices.company_id in (?)", user.companies.map{|c| c.id}).group("device_groups.title")
    end
  end
end

Согласно документации (второй фрагмент кода), вы также можете наследовать подкласс.

person nikkon226    schedule 08.05.2015