MouseOver Studio

MouseOver Studio header image 2

Paginação dos últimos registros em Rails com will_paginate_latests

November 15th, 2008 por Diego Carrion · 4 comentários

will_paginate é uma gem que ajuda a paginar um modelo em dois simples passos. Um dos dois passos, exatamente o primeiro, consiste em selecionar os registros que irão ser mostrados na paginação, podendo especificar a página para a qual estamos solicitando os dados e a ordem em que devem ser ordenados.

A motivação

No processo de paginação, muitas vezes queremos trabalhar com as ultimas ocorrências de um modelo (comentários, posts, twitts, tickets, etc), pelo que terminamos executando algo assim:

Android.paginate(:page => params[:page], :order => 'id DESC')

O problema

O código mostrado não é ruim, mas eu me senti criando código repetitivo é decidi então criar um método que encapsulasse o processo e torne o código um pouco mais legível.

Minha primeira intenção foi adicionar um método chamado paginate_latests na classe ActiveRecord::Base, mas eu queria que o método criado pegasse o valor de params[:page] como convenção e params é uma variável que existe a nível do controller, pelo que essa não era uma opção.

Minha segunda intenção foi adicionar um método na classe ActionController::Base, de tal modo que eu tenha acesso à variável params e consiga delegar o processo para o método criado em ActionController::Base pela gem. Num primeiro momento pensei em criar um fork da gem will_paginate e adicionar esse comportamento, mas o problema com isto é que a intenção da gem é ser agnóstica, ser independente de algum framework, e meu interesse se reduzia ao Rails.

A solução

Como quando pensamos em Ruby criamos gems e quando pensamos em Rails criamos plugins, criei um plugin com o comportamento desejado, um plugin o qual chamei de will_paginate_latests. Em poucas palavras, will_paginate_latests é um plugin que nos permite executar o seguinte código em nossos controllers:

paginate_latests :androids

O código fica bem claro e a pagina não precisa ser especificada devido a que ela é automaticamente pega de params[:page].

Instalação

Para instalar o plugin basta executar na raiz do projeto Rails:

script/plugin install git://github.com/dcrec1/will_paginate_latests.git

O plugin will_paginate_latests utiliza a gem will_paginate pelo que ela devera estar instalada no sistema.

Tags: plugin · rails

4 respostas ate agora ↓

  • 1 Carlos Brando // Nov 17, 2008 at 6:11 pm

    Legal, gosto destas simplificações.

  • 2 Mickele Moriconi // Nov 26, 2008 at 12:40 am

    Interessante, quando mais agilizar no desenvolvimento melhor, só não sei se é a melhor opção utilizar o ‘id DESC’, por causa de bancos com ids não-sequenciais, alguma razão pra não utilizar ‘created_at DESC’?

  • 3 Diego Carrion // Nov 26, 2008 at 8:19 am

    Oi Mickele, no começo eu implementei a funcionalidade com created_at DESC mas alguns dos testes não passarom porque mais de um registro tinha sido criado no mesmo segundo.

    Talvez deva fazer ‘created_ad DESC id DESC’, onde limitaria o problema a registros criados no mesmo segundo em bancos com ids nao sequencias.

    Uma melhor ideia ou pull request é bem vindo (:

  • 4 Mickele Moriconi // Nov 26, 2008 at 12:51 pm

    Realmente, tem esse problema haha.

    E pensando melhor a sua solução ainda é a mais usada, muitos não usam a coluna created_at e acredito que quem use uma tabela com ids não sequenciais já tenha pensado em alguma solução para isso.

    Talvez um initializer… ok ok, parei! :x

Deixar um comentário