Pundit Scope 继承
Pundit Scope inheritance
我需要专家中的范围继承之类的东西。想象一下这个场景:
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
class 的唯一区别在于 resolve
方法。
如何在不复制粘贴此样板代码的情况下在其他策略中重复使用 ApplicationPolicy
中的相同 Scope
class?
你可以这样做:
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(第二个代码片段),你也可以继承子类。
我需要专家中的范围继承之类的东西。想象一下这个场景:
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
class 的唯一区别在于 resolve
方法。
如何在不复制粘贴此样板代码的情况下在其他策略中重复使用 ApplicationPolicy
中的相同 Scope
class?
你可以这样做:
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(第二个代码片段),你也可以继承子类。