从我在源代码中可以确定的是,maximum_page_size
不能在资源级别被直接覆盖,所以处理这个问题的最好方法似乎是实现一个自定义Paginator
.
对于您给出的例子,我认为下面这样简单的东西应该可以用:
class LimitedPageSizePaginator < PagedPaginator
MAX_PAGE_SIZE = 100
def initialize(params)
super
verify_page_size_limit
end
private
def verify_page_size_limit
if @size > MAX_PAGE_SIZE
fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size,
detail: "size exceeds maximum page size of #{MAX_PAGE_SIZE}.")
end
end
end
然后,您应该能够为您的资源指定Paginator
module Api
class LogResource < ApplicationResource
immutable
model_name 'Api::Log'
primary_key :uuid
paginator :limited_page_size
def self.default_sort
[{ field: 'time_start', direction: :desc }]
end
end
end
如果您需要使其更灵活,例如,不是固定常量.然后,我们需要创建一个方法,该方法动态地创建一个设置了适当限制的类,然后将其用作Paginator
,类似于.
module PaginatorCreator
class LimitedPaginator < PagedPaginator
class << self
attr_accessor :limit
def paginator_name
self.name.demodulize.underscore[..-11].to_sym
end
end
def initialize(params)
super
verify_page_size_limit
end
private
def verify_page_size_limit
if @size > self.class.limit
fail JSONAPI::Exceptions::InvalidPageValue.new(:size, @size,
detail: "size exceeds maximum page size of #{self.class.limit}.")
end
end
end
def self.create_limited_paginator(resource:,limit:)
klass = Object.const_set("#{resource.name.demodulize}LimitedPaginator",Class.new(LimitedPaginator))
klass.limit = limit
resource.paginator(klass.paginator_name)
end
end
然后将其用作
class LogResource < ApplicationResource
PaginatorCreator.create_limited_paginator(resource: self, limit: 100)
end
Please Note:我没有使用过此库,因此可能有更好的解决方案.