Paginación a medida en Rails

posted on 14 Sep 2007 |

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.