Fork me on GitHub

Viagens, opiniões e afins

by Andre Fonseca


Colocando auditoria de mudança na sua app Rails

Bom no meu projeto atual estou usando Ruby on Rails. Estou adorando. A coisa é realmente fantástica e me sinto obrigado a dizer que é a melhor opção para desenvolver produtos web.  Mas não é por isso que resolvi escrever este post. Quero compartilhar um aprendizado adquirido.

Dentro da nossa aplicação precisamos mapear (auditoria) as alterações que são feitas em um determinado objeto.  Seria registrar no banco de dados quais campos alterados e, além disso, registra também qual era o valor antes e depois da alteração. Vamos a um exemplo.  Imaginemos que tenho um usuario; esse usuário tem nome, telefone e endereço. Ao alterar o nome dele, quero que fique resgistrado que seu nome foi alterado de um valor “A” para um valor “B”.

Ficando claro a necessidades vamos para a solução.  Passei então para procurar algum plugin que me ajudasse nessa missão. Encontrei vários.  ”Acts_as_audited”,  foi um dos mais interessante que encontrei e recomendo se seu modelo for simples sem relacionamentos muito para muitos.  Mas apesar do plugin resolver o problema, fiquei intrigado de como seria possível fazer isso. Imaginei soluções das mais mirabolantes. Desde de criação de metodos proxies, a magias negras de alta classe (desculpem a brincadeira rubistas) .

Oque achei, como tudo no Ruby, foi a coisa mais simples e fácil já vista. Desde a versão 2.0 do rails, as classes active records ganharam alguns métodos que ajudam bastante nessa missão. São eles: changed?, changes, <atributo>_changed?, <atributo>_was, etc.

changed?  : ele indica se houve ou não alteração nos atributos do objeto. (false se não e true se sim)

changes : devolver um dicionario com as alterações que ocorreram. A chave dele é a propriedade e o valor é uma tupla com o valor antigo e o novo valor

<atributo>_changed? : é um metodo que diz se o atributo mudou. Algo como : usuario.nome_changed?

<atributo>_was : mostra o valor antigo do atributo

<atributo>_will_change! : meio que força a flag indicando que houve uma alteração.

Com esses métodos na mão é possível, sem ajuda do plugin fazer você mesmo sua funcionalidade de auditoria do sistema de forma bastante maneira.  Basta além deles usar os triggers before e after (create, update, etc) do model para chamar os métodos que farão a mágica acontecer.

Espero que ajude. Para saber mais, veja o screencast: tracking_attribute_changes.m4v

Abraços e até a próxima

Published by Andre, on julho 15th, 2010 at 6:51 pm. Filled under: ruby Tags: , , , , , No Comments

[OT]Uma mensagem para meus amigos.

Este final de semana enterrei uma amiga. Ela tinha em torno dos seus 35 anos. Morreu de cancer na medula, alguns o chamam de linfoma. Levou apenas 6 meses desde o diagnóstico ao óbito. Para mim parece que foi ontem que estivemos juntos (eu, ela e seu marido) conversando. A Patrícia foi um anjo da guarda para mim durante minha estadia na França. Como não pude levar minha família, por várias vezes me sentia muito sozinho e deprimido. Quando chegava nesse estado, ficava a um passo de fazer besteira (pegar o primeiro avião e voltar, etc)… nesses horas Alcino (marido de Patrícia) ou/e ela sempre apareciam e me faziam sentir em família. Isso era um balsamo para mim e tornava leve meu período lá longe.
Durante o seu velório, vi muitas pessoas lá. A maioria não eram da família; eram amigos feitos ao longo da vida em vários locais. A grande parte desses amigos vinham da michelin pois ela trabalhou lá por mais de 10 anos. Todos com quem conversei tinham lembranças parecidas a respeito dela: viam em seus memórias momentos dela rindo, confortando, brincando, falando besteira.
Ao voltar para casa não consegui fugir da reflexão que tal fato me causou. Não se perde uma amiga todos os dias (assim eu espero). Vi que as coisas que realmente ficam são que menos damos importância. Nesse mesmo dia, desacelerei e resolve ler com mais atenção vários twitter, textos, e-mails… Precisa digerir com mais tranquilidade e verdade aqueles conteúdos em busca dos seres humanos por trás daquilo. Confesso que me assustei com alguns, me encantei por outros, etc.
Uma das coisa que me chamou a atenção, como já disse antes, que as coisas que guardamos são os pequenos sorrisos e lágrimas que damos ao longo da existencia. Nada mais fica. Por mais que digam ao contrário, faça você mesmo um exercício e tente se lembrar de alguém que já se foi. Verá que as memórias que virão serão aquelas que marcaram seu emocional.
Nos vejo, isso também me incluo, nos mecanizando, copiando sentimos de Vulcanos (momento nerd – Star Trek) … Tendemos a dar mais valor para nossas aptidões racionais as emocionais. Nos chama mais atenção o cara que sabe para caramba, que leu 50 livros em duas semanas (pelo menos disse), e por aí vai. Mesmo que esses heróis sejam arrogantes, prepotentes, desumanos. Nessa revisão que fiz em alguns dos textos, vi um twitter em que alguém afirmou: “Prefiro trabalhar com um arrogante mais bom, do que um cara gente boa…” . Eu entendo que isso se deve ao fato que no trabalho queremos estar perto de quem nos irá ajudar. Respeito e concordo. Mas acredito, depois desse final de semana, que não podemos levar essa admiração para fora desse contexto de trabalho.
Devemos entender que não precisamos ser os caras mais legais do mundo, entretanto, não precisamos ser frios feito uma pedra de gelo. Podemos ter um pouco de doçura no tratar. Podemos entender a limitação do outro. Podemos ser humildes em reconhecer coisas boas em qualquer um. Podemos nos doar tendo paciência com alguém que não está na mesma rotação que a gente. Nunca sabemos qual será nosso dia de bilhete azul.
Daí, antes de eu querer dizer oque é certo  e errado, prefiro dizer deixar a pergunta: “como deseja ser lembrado ? ” . A resposta dessa te dirá se deve ou não concordar com o texto acima.
Bom tudo isso para no final dizer: “Meus amigos muito obrigado por todos os momentos. Obrigado a você pelos conselhos. Obrigado a você pela chopp e pela as risadas junto. Obrigado a você que me mandou aquele torpedo agradecendo minha presênça (me fez sentir especial), obrigado a você pelo email com uma mensagem legal, obrigado a você pelo bom dia que me deu, obrigado a você pelas lágrimas que me ajudou a secar. Obrigado a todos vocês que me fazem lembrar de sentimentos e não de momentos nerds onde foram resolvidos um mega problema com um código minímo.”
Precisa dizer  isso antes que fosse tarde demais.
Published by Andre, on julho 12th, 2010 at 9:56 am. Filled under: noticias Tags: , , 1 Comment