Не удается получить, будет разбивать страницы 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 перезаписывает эту логику при разбивке на страницы.