Strict Standards: Non-static method themeGluedIdeas_Subtle::initOptions() should not be called statically in /home/riopro/www/blog.riopro.com.br/wp-content/themes/gluedideas_subtle/header.php on line 19
Riopro Blog - » Marcando um registro como excluído ao invés de excluir: acts_as_paranoid

Marcando um registro como excluído ao invés de excluir: acts_as_paranoid



Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

No desenvolvimento de um novo projeto da Riopro, baseado em Ruby on Rails, estivemos pensando em como alterar alguns de nossos modelos para que ao invés de excluir definitivamente, só marcasse o registro como excluído. Queriamos manter esses registros na nossa tabela para realizar consultas posteriormente.Encontramos então uma boa idéia, a biblioteca acts_as_paranoid. Essa biblioteca substitui o comportamento padrão do ActiveRecord em 4 coisas principais:

  1. Ao invés de excluir um registro, coloca a data-hora atual em um campo deleted_at (obviamente esse campo deverá ser acrescentado à sua tabela em uma migration antes de colocar a biblioteca para modificar o comportamento do seu modelo);
  2. Faz com que as buscas ignorem por padrão os registros cujo campo deleted_at não seja nulo, ou seja, ActiveRecord::Base#find por exemplo só retornará os registros cujo campo deleted_at for NULL;
  3. Cria métodos para que se possa achar os registros “deletados”, como por exemplo ActiveRecord::Base#find_with_deleted (que na verdade é o find original);
  4. Permite que um registro pai veja um registro filho mesmo que o filho tenha sido excluído (sobrescreve o find_target para realizar a busca com os registros marcados como deleted_at).

O grande problema encontrado foi a falta de atualização da biblioteca. A página original da biblioteca parou em 2005. Mas o acts_as_paranoid não deixou de ser atualizado. Ele continuou o desenvolvimento na página do Rick Olson. O trunk do projeto está focado na adaptação da biblioteca para a versão 2.0 do Rails. Como utilizamos a utilizamos a versão 1.2.6 do Rails, optamos por baixar a tag 1.1.4 da biblioteca e fazer pequenas adaptações (principalmente para incluir o comportamento do item 4 da lista acima).

Outra coisa é que optamos por utilizar a biblioteca como um plugin ao invés de uma gem disponível para todos os projetos. Dessa forma, a instalação em todos os micros de desenvolvimento foi facilitada pois comitamos no nosso repositório (essa na verdade foi uma opção que fizemos até para a atualização em produção ficar mais simples). Para baixar o plugin fizemos (no diretório da aplicação):

$ script/plugin install http://svn.techno-weenie.net/projects/plugins/tags/acts_as_paranoid-1.1.4/

Em seguida fizemos duas modificações no plugin, copiadas do trunk do acts_as_paranoid. A primeira foi baixar o arquivo belongs_to_with_deleted_association.rb. A segunda foi baixar o init.rb para que o plugin seja carregado corretamente pelo Rails, incluindo o novo arquivo baixado.

$ cd vendor/plugins/acts_as_paranoid-1.1.4/ $ wget http://svn.techno-weenie.net/projects/plugins/acts_as_paranoid/lib/caboose/acts/belongs_to_with_deleted_association.rb lib/caboose/acts/ $ wget http://svn.techno-weenie.net/projects/plugins/acts_as_paranoid/init.rb .

Feito isso, foi só começar a usar! Criamos uma migration para acrescentar os campos de deleted_at:

class AddActsAsParanoid < ActiveRecord::Migration

def self.up

add_column :modelo1, 'deleted_at', :datetime

add_column :modelo2, 'deleted_at', :datetime

enddef self.down

remove_column :modelo1, 'deleted_at'

remove_column :modelo2, 'deleted_at'

end

end

E em seguida alteramos os modelos para terem o comportamento modificado pelo plugin

class Modelo1 < ActiveRecord::Base

#ao inves de excluir os registros, coloca um dia/hora do momento da exclusao

#e o registro nao e mais mostrado

acts_as_paranoid

...

Bom uso…

Informações e Links

Junte-se comentando, lendo o que os outros dizem ou colocando um link a partir do seu blog.


Outros Artigos

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
A Riopro coloca no ar seu novo projeto: VoteBolsa

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Instalando o VMware Server no Ubuntu 7.10

Comente

Tire um tempo para comentar e nos dizer o que você acha. Alguns códigos HTML são permitidos para formatação.

Comentários dos Leitores


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

[…] acts_as_paranoid - esse plugin importante principalmente em sistemas sujeitos a auditoria. Ao deletar um registro, ele no o remove do banco de dados e apenas o marca como “excludo”. […]