Alex Florentino

KISS - Keep It Simple, Stupid
May 10th, 2008

Ruby On Rails – Counter cache

Uma feature muito interessante no Ruby On Rails é a “counter_cache” , mais o que seria counter cache ? vou explicar através de um exemplo , supomos que você esteja desenvolvendo um site de contatos, suponhamos que você queira mostrar a quantidade de contatos por tipos algo no estilo da listagem abaixo:

 

Categoria Quantidade
Familia 10
Profissional 15

na maneira “tradicional” , essa listagem sempre acarretaria em varios “selects”, ou seja, um select seleciona todos os tipos de contatos e um select para totalizar cada tipo, imagine, seu sistema tem 1.000,000 tipos de contato você teria 1.000,000 selects + 1.

O ruby counter cache minimiza este problema, pois ele cria uma nova coluna na tabela categoria com a quantidade correta de contatos.

Então vamos ao código.

 

  1. Criar o projeto rails

     rails contato 	--database=mysql
    
  2. Configuração

     edite seu 	config/database.yml e altere os dados do seu  banco de dados mysql
    
  3. Criar a base de dados

     rake  db:create
    
  4. Deixar o ruby criar algum código

    
    ruby 	script/generate scaffold Categoria nome:string
    
    
    ruby 	script/generate scafffold Contato nome:string email:string 	fone:string categoria_id:integer
    
  5. Vamos criar as tabelas

     rake db:migrate
    
  6. agora vamos setar nosso relacionamentos no model
    edite o app/models/categoria.rb que deve ficar como :

    
    class Categoria < ActiveRecord::Base
    has_many :contato
    end
    

    edite o app/models/contato.rb qude deve ficar como:

    
    class Contato < ActiveRecord::Base
    belongs_to :categoria
    end
    

    agora você já pode iniciar o servidor ruby script/server e acessar http://localhost:3000/categorias.

  7. vamos editar a view index da categoria e adicionar a quantidade de contatos:

    ...<table>
    <tr>
    <th>Nome</th>
    <th>Quantidade</th>
    </tr>
    
    <% for categoria in @categorias %>
    <tr>
    <td><%=h categoria.nome %></td>
    <td><%=h categoria.contato.length %></td>...
    
  8. agora vamos fazer a magica acontecer, vamos primeiro adicionar a coluna magica no seu modelo categoria

     ruby script/server migration 	add_categoria_count_cache
    

    edite esse novo arquivo:

    
    class AddCategoriaCountCache < ActiveRecord::Migration
    def self.up
    add_column :categorias,:contatos_count,:integer,:default => 0
    end
    
    def self.down
    end
    end
    

    logo após isso rode rake novamente,da pasta raiz do seu projeto:

    
    rake db:migrate
    
  9. Agora vamos atualizar o Contato para sempre atualizar o count_cache, para isso basta editar o app/models/contato.rb

    
    class Contato < ActiveRecord::Base
    belongs_to :categoria, :counter_cache => true
    end
    

Pronto se tudo correu bem é para o counter cache estar habilitado, para testar basta acessar ruby script/console cadastrar algumas categorias e popular alguns contatos para essas categorias e verificar o resultado no browser.

aqui um outro ótimo exemplo.

divirta-se!

 

Leave a Reply