Как разбить несколько моделей на страницы с помощью драгоценного камня Pagy в Rails?

#ruby-on-rails #ruby #pagination #searchkick #pagy

Вопрос:

Я использую Searchkick с драгоценным камнем Pagy для разбиения результатов поиска на страницы, и это отлично работает, если я выполняю поиск и разбиение на страницы только по одной модели, но я не могу понять, как это сделать с помощью Pagy, когда мне нужно объединить несколько моделей в один набор результатов поиска Searchkick.

Я попытался использовать «дополнительный массив» Pagy, чтобы объединить все отдельные запросы модели Searchkick в массив, а затем просмотреть результаты в представлении, но это не вернуло никаких результатов поиска.

Вот код контроллера, который работает для одной модели:

 query = params[:q].presence || "*"
results = BlogPost.pagy_search(query, suggest: true, per_page: 20)
@pagy, @results = pagy_searchkick(results, items: 10)
 

И в представлении:

 <%= pagy_nav(@pagy).html_safe %>
 

Следующее работает как комбинированный запрос Searchkick для нескольких моделей, но он не разбит на страницы:

 @search_results = Searchkick.search(query, models: [PressRelease, BlogPost, User])
 

Как же тогда я должен разбивать страницы на несколько моделей? Документы для «Дополнительного массива» Pagy предупреждают:

если данные в массиве поступают из какой-либо базы данных или другого постоянного хранилища (т. Е. Не из хранилища в памяти), вам обязательно следует просмотреть свой код

Это именно то, что я пытаюсь сделать. Использование Pagy для разбиения результатов поиска по страницам из нескольких моделей кажется возможным. Если вы не должны использовать массив страниц для этого, то как вы должны это сделать?

Ответ №1:

Вы можете поместить это в инициализатор страницы:

 Searchkick.extend Pagy::Searchkick
 

Тогда вы можете использовать его как обычно:

 results = Searchkick.pagy_search(query, models: [PressRelease, BlogPost, User])
@pagy, @results = pagy_searchkick(results, items: 10)
 

Это не задокументировано, поэтому вам, вероятно, следует создать проблему с документацией для отсутствующей документации.

Комментарии:

1. Ага. Добавление Searchkick.extend Pagy::Searchkick в инициализатор страницы было именно той проблемой. Теперь работает как заклинание. Большое спасибо!