Rails Searchkick с областями в контроллере - PullRequest
0 голосов
/ 03 июля 2018

Я создаю страницу поиска, где у меня есть пара фильтров, и я пытаюсь интегрировать их с Searchkick для запроса продуктов.

Это мои прицелы, которые я использую для продуктов

Модели / product.rb

scope :in_price_range, ->(range) { where("price <= ?", range.first) }    
scope :in_ratings_range, -> (range) { where("average_rating >= ?", range.first) }

def self.with_all_categories(category_ids)
    select(:id).distinct.
    joins(:categories).
    where("categories.id" => category_ids)
end

Это то, где я на самом деле называю границы

Контроллеры / search_controller.rb

@results = Product.search(@query)
@results = @results.with_all_categories(params[:category_ids]) if params[:category_ids].present?
@results = @results.in_price_range(params[:price]) if params[:price].present?
@results = @results.in_ratings_range(params[:rating]) if params[:rating].present?

После запуска я получаю сообщение об ошибке, в котором говорится, что в модели searchkick нет методов с именем моей области.

неопределенный метод `with_all_categories 'для #Searchkick :: Results: 0x00007f4521074c30>

Как использовать области с моим поисковым запросом?

Ответы [ 2 ]

0 голосов
/ 09 августа 2018

Вы можете применить области к результатам Searchkick с помощью:

Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }

См. «Запуск дополнительных областей по результатам» в файле readme .

.

Однако, если вы примените фильтры ActiveRecord where, это приведет к смещению нумерации страниц. Для правильной работы нумерации страниц необходимо использовать опцию Searchkick where:

Product.search(query, where: {price_range: 10..20})
0 голосов
/ 03 июля 2018

Ошибка (неизвестная мне на момент написания этого ответа) может быть вызвана тем, что вы определили with_all_categories как метод класса на Product, но в вашем контроллере вы вызываете его на @results, который должен быть ActiveRecord::Relation.

Превращение в scope должно решить проблему:

Изменить это:

def self.with_all_categories(category_ids)
  select(:id).distinct.
    joins(:categories).
    where("categories.id" => category_ids)
end

до:

scope :with_all_categories, -> (category_ids) { select(:id).distinct.joins(:categories).where("categories.id" => category_ids) }
...