Searchkick 在使用分页时获取所有结果

Searchkick get all results when using pagination

我有以下使用 searchkick 的产品搜索查询:

def index
  @filter = params[:filter].blank? ? nil : Search.find(params[:filter])

  if @filter.present?
      @products = @filter.products(set_order_column(@sort), @direction, params[:page], @per_page)
  else
      query = @query.presence || "*"

      @products = Product.search(
        query, 
        where: {
          active: true
        }, 
        page: params[:page], 
        per_page: @per_page, 
        order: [{
          "#{set_order_column(@sort)}" => "#{@direction}"
        }],
        misspellings: { distance: 2 },
        fields: fields)
  end

  @filter_product_ids = @products.map(&:id)
end

有一个变量filter_product_ids,我需要在其中存储所有未被@per_page 过滤的结果。有可能这样做吗?现在,只有结果 @per_page.

不分页获取所有结果的目的是为网站上用于各种产品分类的所有产品获取唯一值以进行过滤。

感谢您的任何提示,Miroslav

只需删除

params[:page], @per_page

page: params[:page], 
per_page: @per_page,

来自您的代码。

我的解决方案是将它放在它自己的 class(服务 class)中,然后

class ProductFilter
  attr_reader :search_params, :search_query, :pagination_params

  def initialize(search_params, search_query, pagination_params)
    @search_params = search_params
    @search_query = search_query
    @pagination_params = pagination_params
  end

  # Will return all records from searchkick, unpaginated
  def filtered_products
    Product.search(search_query, search_param_stuff)
  end

  # Will return all filtered_products & then paginate on that object
  def paginated_products
    filtered_products.records.paginate(pagination_params)
  end

  private
  def search_param_stuff
    search_params
  end
end

无论如何,searchkick 的分页方法实际上适用于 searchkick 记录对象,因此您只需在一个方法中提取 ES 查询(不传递分页参数),然后在 filtered_products.records 上分页。