2011-03-24 9 views
14

En el caso en que tengo el id de un artículo paginado, ¿cómo puedo encontrar su número de página?Rails Pagination: busque el número de página del ID de instancia

Estoy usando rails 3 y kaminari.

Desafortunadamente, pasar el número de página como parámetro no es una opción. Los elementos paginados son imágenes de una galería de imágenes mantenida por el contenido generado por el usuario que evoluciona a lo largo del tiempo. Esto significa que una imagen puede aparecer en la página uno en la semana uno, pero la página 2 en la semana siguiente.

Otra opción hubiera sido mantener un orden numérico de las imágenes (act_as_list), de nuevo, esto no es posible en mi caso ya que las fotos pueden aparecer en varias galerías de diferentes ámbitos.

edición:

han añadido una recompensa a esto como veo hace la misma pregunta se le preguntó años en diversos lugares sin solución. Me complace aceptar una consulta sql si no aparece una solución de registro activa.

+0

Esto podría ser muy ineficiente, pero supongo * que funciona https://gist.github.com/885484 (aún no lo he probado), sería bueno obtener el resultado con una consulta, pero parece que ser un problema difícil, me encantaría ver otro enfoque sin ese lazo. – jpemberthy

+0

Hola y gracias por la respuesta. Eso funcionaría pero esperaba más por una consulta, ya que esto sería lento en las colecciones grandes. – mark

Respuesta

19
# 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 

Ahora se puede envolver como un método de clase

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 

Uso

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

Gracias por la respuesta. Estoy seguro de que esto estará bien, pero aún no he tenido la oportunidad de probarlo como ocupado en otras cosas. – mark

+1

Hola de nuevo y disculpe el retraso en llegar a esto. Tu respuesta funciona con una corrección; para obtener la posición es necesario tener una <= condición. Gracias por tu ayuda. – mark

+0

Un refinamiento. si ordena por columnas no uni, los resultados pueden ser incorrectos. lo que funciona para mí es https://gist.github.com/pironim/5975256 – Vladimir

0

Si encuentra la identificación de la página significa que necesitará algunas consultas sql. en lugar de eso, puedes pasar el valor de la página como un param. Esto aumentará tu rendimiento también.

+0

Gracias Ramanavel. Mi problema con esto es que la instancia paginada no siempre aparece en la misma página de sus registros asociados. Agregaré una aclaración con respecto a esto a la pregunta. – mark

0

que tenía el mismo problema pero con pero con varios pedidos. Solo podría hacerlo funcionar con un pequeño truco.

@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 

sólo funciona bien si usted no tiene a muchos registros en el resultado de las agallas, de lo contrario obtendrá lento.