2015-05-01 1 views
1

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

+0

расширить 'ApplicationPolicy' класс ' '' класса DeviceGroupPolicy itsnikolay

+0

Не работает. Метод 'resolve' объявляется внутри вложенного класса Scope, а не класса' ApplicationPolicy' –

ответ

0

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

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 

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