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 - » DejaVue, guardando as alterações dos dados do seu modelo usando o MongoDB

DejaVue, guardando as alterações dos dados do seu modelo usando o MongoDB



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

A Riopro está lançando uma nova Gem chamada DejaVue. Essa Gem permite o versionamento dos dados de seus modelos de forma simples. Fortemente baseada no PaperTrail, ela se possui três diferenças principais:

  • O armazenamento das versões se dá no MongoDB (banco de dados não sql).
  • Ela permite também armazenar objetos relacionados ao modelo (contanto que o relacionamento seja um para um), de forma que o objeto possa ser visto exatamente como ele era quando foi alterado. Por exemplo, ao alterar um Post do seu Blog (um modelo BlogPost) o DejaVue pode guardar no histórico como estava o objeto do Usuário (um modelo User relacionado) que criou o Post naquele momento. Isso permite recuperar a versão do Post, mesmo que o Usuário seja apagado futuramente.
  • Além disso, o DejaVue permite guardar no histórico atributos acessíveis mas que não são persistidos junto com o objeto.

Como usar o DejaVue?

Simples, adicione a gem à sua aplicação e, no modelo que deseja versionar adicione a linha:

def Post < ActiveRecord::Base

 has_deja_vue

end

Pronto, seu modelo passará a guardar o histórico de alterações. É importante dizer que a DejaVue pressupõe que você possui um servidor MongoDB configurado para a sua aplicação (usando as gems mongo e mongo_mapper).

Um ponto interessante é que o DejaVue cria históricos separados pelos tipos create, update e destroy tal qual o PaperTrail. A diferença é que o PaperTrail armazena como último histórico a última versão realizada enquanto o DejaVue armazena a versão atual.

O que isso muda? Bem, quando você cria um objeto, o PaperTrail cria uma versão do tipo create, mas sem armazenar nenhuma informação do objeto. Ao modificar, ele cria uma versão de update, com os dados do objeto antes do mesmo ter sido alterado. E na exclusão, guarda os dados do objeto logo antes da exclusão. É consistente, mas trabalhoso.

Já no DejaVue, cada histórico armazena os dados atuais do objeto. Assim, ao criar um objeto, o histórico do tipo create terá todos os dados existentes no objeto no momento da criação. E ao alterar, todos os dados do objeto atualizado. Ao excluir, todos os dados do objeto logo antes da exclusão.

Outras características:

Além do que foi mostrado acima, usando o DejaVue você pode:

  •  Ignorar alterações em certos campos do seu modelo. Ou seja, o histórico não é criado se apenas campos que são ignorados foram alterados. Por padrão, campos como created_at e updated_at são ignorados
  • Armazenar quem realizou a alteração. O DejaVue busca por um método current_user disponível no seu controller da mesma forma que no PaperTrail faz.
  • Definir explicitamente um usuário dentro de um bloco (especialmente útil para o caso de processamentos em background)

E para o futuro, o que esperar?

  • Permitir atualizar os dados do objeto com os valores existentes em um determinado histórico
  • Recriar objetos que foram apagados em definitivo
  • Um método de instância para comparar o histórico atual com outro histórico do objeto
  • Armazenar no histórico relacionamentos um para muitos (como todos os comentários de um Post no momento da alteração do Post)
  • Permite navegar para frente e para trás no histórico de um objeto do modelo
  • Por usar o MongoDB como camada de persistência, não são necessárias migrations
  • Compatível com Rails 2.3 (não foi verificado se é compatível ou incompatível com Rails 3 até o momento)
  • Testes para a Gem usando RSpec

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
Ubuntu 10.10 sem aptitude

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Adicionando assinatura de repositórios de terceiros ao seu Ubuntu

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

Seja o primeiro a comentar!