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

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…

1 opinião sobre “Marcando um registro como excluído ao invés de excluir: acts_as_paranoid”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *