Limpando o cache de outros models no Rails
by Ricardo Yasuda on April 22, 2009 20:50

Frequentemente fazemos Page Cache na DBurns, para melhorar a performance das nossas aplicações. Um dos problemas que temos enfrentado nos últimos projetos é limpar o cache de outros models, quando modificamos alguma página no nosso CMS, principalmente quando temos um submenu dinâmico, com as filhas de uma página.
Digamos que temos um model Page e um model NewsArticle. Quando alteramos alguma coisa no Page queremos limpar o cache, através de um sweeper, tanto de Page como de NewsArticle.
Todas as soluções que encontramos, entre elas o tutorial de cache do Rails Envy, diziam para mudar o diretório de cache e apagá-lo por inteiro. Veja no tutorial mais detalhes de como fazer isso.
Só que o problema é que tanto o Mongrel quanto o Apache não sabem ler o cache se não for o padrão (em /public). Então você precisaria fazer um patch no Mongrel e uma mudança no httpd.conf do Apache:
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/$ /cache/index.html [QSA,L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /cache/$1.html [QSA,L]
OK, fácil, mas nem sempre temos acesso às configurações do Apache em produção, e por .htaccess não funciona, já tentamos. Para não depender do servidor onde fazemos deploy, a solução foi usar o mesmo procedimento (apagar o diretório inteiro), só que usando o diretório padrão de cache.
Fiz isso, daí o Marcio Trindade deu a idéia de transformar em um método e colocar numa lib, adicionando o método ao ActionController::Caching::Sweeper. Daí poderíamos aproveitar para outros sweepers. Foi o que eu fiz, colocando o arquivo em config/initializers:
E o sweeper ficou:
Tags: rails, sweeper, cache, initializer, clear
You may also like:
- Últimos eventos
- 6o Encontro do Guru-SP - Testes
- Rails Summit 2009
- Formate melhor seu console do Rails ou irb com Hirb
- Rails Rumble 2009 - Game Over

