Pundit Scope继承

时间:2015-05-01 15:23:08

标签: ruby-on-rails ruby-on-rails-4 authorization 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类?

1 个答案:

答案 0 :(得分: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(第二个代码片段),您也可以继承子类。