Путаница в конфигурации ThinkingSphinx :: OutOfBoundsError - PullRequest
0 голосов
/ 13 июня 2018

Попадание в ошибку OutOfBoundsError из-за неправильного понимания правильного синтаксиса конфигурации (который также может быть побочным продуктом устаревшего синтаксиса).

В руководстве предлагается поиск класса по WillPaginate.стилизованные параметры.Имея много полей для рисования, модель определяется как

class AziendaSearch < BaseSearch
  set_per_page 10000
  accept :terms
end

, set_per_page был переведен на высокий уровень, потому что, если я установлю его на целевое значение 100, ссылки will_paginate не будут отображаться.

контроллер может быть излишне запутан, чтобы включить параметр упорядочения, и, следовательно, привести к двухэтапному процессу:

@azienda_search = AziendaSearch.new params
@results = @azienda_search.search
@aziendas = Azienda.order('province_id ASC').where('id IN (?)', @results).paginate :page => params[:page], :per_page => 100

представление разбивается на основе @aziendas:

<%= will_paginate @aziendas, :previous_label => "precedente ", :next_label => " successiva" %>

Я подозреваю, что модель поиска не установлена ​​должным образом, но синтаксис для меня не очевиден, учитывая указания руководства.page params[:page] определенно не работает ...

Обновление BaseSearch является Sphinx-методом и фактически было унаследовано от более старой версии этого приложения (rails2.Икс...).Так что это может зависать, создавая всякую синтаксическую путаницу.

Фактически, следуя руководству, я теперь совершенно не уверен в том, как лучше всего сделать эти заявления.Нужно ли определять отдельный класс для AziendaSearch?Если нет, то где должен быть вызван блок Azienda.search в контроллере как таковом?

@azienda_search = Azienda.search(
  :max_matches => 100_000,
  :page        => params[:page],
  :per_page    => 100,
  :order       => "province_id ASC"
  )
@results = @azienda_search.search

1 Ответ

0 голосов
/ 15 июня 2018

Я не уверен, что BaseSearch делает с set_per_page (это, конечно, не метод Thinking Sphinx), но стоит отметить, что Sphinx по умолчанию использует максимум 1000 записей. Возможно сконфигурировать Sphinx так, чтобы он возвращал больше , однако - вам нужно установить max_matches в вашем config/thinking_sphinx.yml на ваш предпочтительный предел (для среды):

production:
  max_matches: 100000

А также установитьограничение для соответствующих поисковых запросов:

Azienda.search(
  :max_matches => 100_000,
  :page        => params[:page],
  :per_page    => 100
)

Что касается дублированных запросов ... если вы добавите province_id в качестве атрибута в своем определении индекса, вы сможете заказать поисковые запросы этим.

# in your Azienda index definition:
has province_id

# And then when searching:
Azienda.search(
  params[:azienda_search][:terms],
  :max_matches => 100_000,
  :page        => params[:page],
  :per_page    => 100,
  :order       => "province_id ASC"
)
...