Registro de Cambios en Tablas

Hola a todos,
Amigos me estan solicitando que el sistema pueda efectuar auditoria a
los
usuarios, es decir, se requiere que se registre en una tabla los
posibles
cambios que puedan realizar los usuarios supervisores a la informacion
registrada por usuarios estandar al sistema. Para que tengan una idea de
lo
que se quiere hacer les explico:
Supongamos que en la tabla articulos se creo uno con el nombre: Cartucho
HP
Negro
Un dia vino el supervisor del almacen y le quiso cambiar el nombre a:
Cartucho de Tina Negro HP Nro. 92

Bueno el detalle es que se quieres guardar en una tabla para poder
generar
un reporte lo siguiente:
Tabla modificada => Articulos
Usuario responsable => supervisor_almacen2
Fecha del cambio => 22/05/2009 10:25:45
Cambios esfectuados:
Campo Nombre:
Valor Anterior: Cartucho HP Negro
Valor Actual: Cartucho de Tina Negro HP Nro. 92

Se que lo que me estan pidiendo no es nada facil y tengo la idea de como
hacerlo pero de manera manual y tengo que echar muchisimo codigo,
entonces
mi pregunta es si existe algun plugins que me permita ahorrarme codigo
en el
modelo de cada tabla del sistema porque tengo tablas que tienes mas de
30
campos y ustedes se podran imaginar el monton de codigo que hay que
hacer
cierto?
espero sugerencia, gracias

Hola Manuel!

Nosotros utilizamos con bastante éxito (aunque para la version 1.2.6 de
Rails) el siguiente plugin:

http://github.com/joshuaclayton/acts_as_auditable/tree/master

Espero que te ayude
Un saludo

Roberto M. Oliva

Manuel P.
escribió:> Hola a todos,

2009/6/10 Manuel P. [email protected]:

Se que lo que me estan pidiendo no es nada facil y tengo la idea de como
hacerlo pero de manera manual y tengo que echar muchisimo codigo, entonces
mi pregunta es si existe algun plugins que me permita ahorrarme codigo en el
modelo de cada tabla del sistema porque tengo tablas que tienes mas de 30
campos y ustedes se podran imaginar el monton de codigo que hay que hacer
cierto?
espero sugerencia, gracias

Primero buscaria un plugin que haga tal cosa.

Si no lo hay, en Rails moderno existen los dirty objects: En un
before_save podrias iterar por los atributos, y de los que han
cambiado preguntar por su valor anterior. Hay API para todo ello, sin
haberlo escrito parece poco codigo.

Con ello haces un insert en la tabla de auditoria. Si el save falla,
como sucede en una transaccion que cubre al before_save el registro en
la tabla de auditoria no queda.

Manuel P. dijo [Thu, Jun 11, 2009 at 10:21:36AM +1930]:

modelo de cada tabla del sistema porque tengo tablas que tienes mas de 30
campos y ustedes se podran imaginar el monton de codigo que hay que hacer
cierto?
espero sugerencia, gracias

Ummm… Posiblemnete la mejor (más completa) manera de implementar
esto sea derivar de ActiveRecord — Por ponerte un ejemplo (simplista e
incompleto, y tremendamente subóptimo):

create_table :log do |t|
t.string :class
t.string :before
t.string :after
t.timestamps
end

class Item < ActiveRecord::Logged
(…)
end

class ActiveRecord::Logged < ActiveRecord::Base
def save
in_db_yaml = self.class.find_by_id(self.id).to_yaml
this_yaml = self.to_yaml
if this_yaml != in_db_yaml
Log.new(:class => self.class.to_s, :before => in_db_yaml, :after
=> this_yaml).save!
end
super
end
end

Tiene MUCHAS mejorías posibles (y no está completo, sólo registraría
lo que grabes explícitamente con #save), pero lo hago para ilustrarte
una manera genérica y extensible de hacerlo.

Saludos,


Gunnar W. - [email protected] - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF