найти страницу для данной записи с помощью kaminari

Проект Ruby on Rails 3. После обновления записи мы возвращаемся к индексу всех записей (а не к просмотру обновленной записи). Индекс страницы с Каминари. Как нам вернуться на страницу индекса, содержащую обновленную запись?


person Douglas Lovell    schedule 13.11.2012    source источник


Ответы (1)


Аналогичный вопрос и ответ для Java JPA/Hibernate Поиск страницы, содержащей данную запись, с помощью JPA (Hibernate), который показывает sql, необходимый для получения смещения записи в представлении индекса. Что-то типа

SELECT COUNT(*)
FROM Model r
WHERE r.column < ?
ORDER BY r.id

Номер страницы будет равен offset/records_per_page + 1.

Тогда возникает вопрос, как получить records_per_page из Kaminari? Kaminari позволяет установить количество записей на страницу в конфигурации и для конкретной модели через Model.paginates_per. Он предоставляет метод Model.default_per_page для получения количества записей на странице для модели.

Лучшее место для определения страницы будет в методе контроллера, который отображает индекс. Этот метод уже получает параметр страницы, если он есть, для отображения правильной страницы. Другим способом было бы вычислить страницу перед перенаправлением и отправить параметр страницы. Попробуем первое.

После сохранения редактирования мы перенаправляем в индекс с параметром, идентифицирующим запись, которую мы хотим включить на страницу индекса перенаправить с параметрами. Индекс сортируется по Model.column.

redirect_to model_index_url(:for_column => @model_record.column), 
   :notice => 'Record saved'

Затем в методе index контроллера мы позволяем параметру страницы управлять или вычисляем страницу из параметра for_column, если он присутствует.

page = 1 
if (params[:page])
  page = params[:page]
elsif (params[:for_column])
  offset = Model.select('count(*) as count').where('? < column',
     params[:for_column]).order(id).first
  page = offset.count/Model.default_per_page + 1
end
@records = Model.all.order('column desc').page(page)

И, конечно же, Model и Model.column обозначают имя модели и столбца для вашего приложения.

person Douglas Lovell    schedule 13.11.2012
comment
В SQlite3 этот метод не работает (моя модель объединена и упорядочена иначе, чем id). Я должен следовать этому решению: stackoverflow.com/a/26547854/1252245 - person sequielo; 03.06.2016