Paginación a medida en Rails

14 de Septiembre, 2007 — Ruby on Rails

Hace un tiempo me encontré con un problema que me costó un poco de trabajo solucionar. Necesitaba hacer un listado paginado, pero para poder ordenarlo era necesario hacer un JOIN de dos tablas. Al final lo he solucionado implementando un método que pagina una consulta SQL pasada como parámetro. El código de la función es el siguiente:

def paginate_from_sql(model, sql_query, total, per_page)
@pages = Paginator.new self, total, per_page, @params[’page’]
@items = model.find_by_sql(sql_query + ” LIMIT #{per_page} ” + “OFFSET #{@object_pages.current.to_sql[1]}”)
return [@pages, @items]
end

Lo he colocado en el application.rb para tener acceso desde cualquier controlador.

Para hacer el listado de una clase llamada Relation, llamo a la función de la siguiente manera:

def list
@relation_pages, @relations = paginate_from_sql(Relation,”SELECT * FROM articles RIGHT JOIN relations ON articles.id=relations.article_id ORDER BY articles.name ASC”,Relation.count, 50)
end

Yo he echo un JOIN de dos tablas, pero no hace falta decir que podeis poner la consulta SQL que necesiteis.

1 Comentario »

  1. No se si para este ejemplo te valdrá, pero yo a veces he usado “paginate_by_sql”.

    También, para hacer joins, se puede emplear “:include” en los métodos find_*

    Comentario por Jaime Iniesta — 20 de Septiembre, 2007 @ 9:23

Redifusión RSS de los comentarios de la entrada.

Deje un comentario

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License. | Emili Parreño