Не удается получить, будет разбивать страницы total_entries на работу, рельсы

Проблема в том, что я хотел бы ограничить количество результатов до 30, поэтому я вставил

контроллер

@users = User.user_search(params[:name], params[:gender]).paginate(page: params[:page], per_page: 20, total_entries: 30)
  render 'user_results' 

Скажем, я получу только 1 или 2 результата назад, я все равно получу нумерацию страниц на две страницы. то есть будет, похоже, что paginate получит результат того, сколько раз total_entries будет делиться на per_page значение. Так что, если я установлю per_page: 20, total_entries: 110 это даст мне шесть ссылок, добавляя еще 10 в качестве страницы.

мой User.user_search Метод в модели пользователя

def self.user_search(a, b)
  users = User.all
  users = User.where('LOWER (name) LIKE LOWER(?)', "%#{a}%") if a.present?
  users = users.where('LOWER (gender) LIKE LOWER(?)', "%#{b}%") if b.present?
  return users
end

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

1 ответ

Решение

total_entries Опция просто является ярлыком, чтобы will_paginate не запрашивал счетчик результатов. Поэтому, если вы действительно хотите ограничить количество результатов, показанных на рисунке, разбейте на страницы, но не запутайтесь в результатах разбивки на страницы, когда результатов всего несколько, вы можете сделать что-то вроде этого:

total_records = User.user_search(params[:name], params[:gender]).count
total_entries = total_records > 30 ? 30 : total_records
@users = User.user_search(params[:name], params[:gender]).paginate(page: params[:page], per_page: 20, total_entries: total_entries)
render 'user_results'

Вы можете подумать, что это добавляет дополнительный запрос, но will_paginate все еще собирался сделать count запрос, чтобы сделать его логику, здесь мы просто переопределяем total_entries, устанавливая максимальное количество записей для отображения.

Однако обратите внимание, что, выполнив это, вы все равно получите больше записей на последней странице (если результат разделения total_records между страницами не является точным), или может быть даже возможно запросить более высокий номер страницы и все же получить "скрытые" результаты.

Если вам действительно нужно не показывать результаты для определенного числа, вам придется использовать такой подзапрос, как этот:

@users = User.where(id: User.user_search(params[:name], params[:gender]).limit(30).map(&:id)).paginate(page: params[:page], per_page: 20)

Однако это может вызвать проблемы, если вместо 30 вы используете очень большое число.


Ранее я предлагал использовать ActiveRecord::QueryMethods.limit, в результате поиска, но will_paginate перезаписывает эту логику при разбивке на страницы.

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