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.
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!
Deixar um comentário