Rails Pagination - найти номер страницы из идентификатора экземпляра

В случае, когда у меня есть идентификатор разбитого элемента, как я могу найти его номер страницы?

Я использую рельсы 3 и каминари.

К сожалению, передача номера страницы в качестве параметра не является вариантом. Разделяемые элементы - это изображения галереи изображений, поддерживаемые созданным пользователем контентом, развивающимся с течением времени. Это означает, что изображение может отображаться на первой странице в первой, а на следующей неделе.

Другим вариантом было бы поддерживать числовой порядок изображений (act_as_list), опять же это невозможно в моем случае, так как фотографии могут появляться в нескольких галереях разных областей.

изменить:

Добавили щедрость к этому, поскольку я вижу тот же самый вопрос, заданный несколько лет назад в разных местах без решения. Я рад принять sql-запрос, если не найдено активного решения для записи.

Ответ 1

# Your "per_page" count
per_page = 30
# Your Image instance:
@image = Image.find_your_image
# SQL. If you're ordering by id, how many lower IDs are there?
position = Image.where("id <= ?", @image.id").count
# Your page
page = (position.to_f/per_page).ceil

Теперь вы можете обернуть его как метод класса

class Image < ActiveRecord::Base
  def page(order = :id, per_page = 30)
    position = Image.where("#{order} <= ?", self.send(order)).count
    (position.to_f/per_page).ceil
  end
end

Использование

@image.page
@image.page(:created_at)
@image.page(:title, 10)

Ответ 2

Если вы находите идентификатор страницы, это потребует некоторых запросов sql. вместо этого вы можете передать значение страницы в качестве параметра. Это также увеличит вашу производительность.

Ответ 3

У меня была такая же проблема, но с несколькими порядками. Я только мог заставить его работать с небольшим трюком.

@model = Model.find(params[:id])
page = 1
  if params[:page]
  page = params[:page]
else
  page = (Model.some_scope.order(some_attribute: :desc, updated_at: :desc).pluck(:id).index(@model.id).to_f / per_page).ceil
end

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