Paginación a medida en 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:
@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 »
Redifusión RSS de los comentarios de la entrada.

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_*