Searchkick получить все результаты при использовании нумерации страниц

У меня есть следующий поисковый запрос для продуктов с использованием 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.

Цель получить все результаты без разбивки на страницы - получить уникальные значения для всех продуктов, которые используются для классификации различных продуктов для фильтрации на веб-сайте.

Спасибо за любые подсказки, Мирослав

2 ответа

Решение

Мое решение состоит в том, чтобы поместить это в свой собственный класс (класс обслуживания), а затем

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

В любом случае, метод поискового поиска для разбиения на страницы фактически работает с объектом записей поискового ключа, так что вы можете просто получить запрос ES (без передачи параметров пагинации) в одном методе, а затем разбить на страницы filtered_products.records,

Просто удали

params[:page], @per_page

а также

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

из вашего кода

Другие вопросы по тегам