2011-08-29 9 views
5

Actualmente estoy tratando de implementar un registro para la sección de administración de mi aplicación de rieles. Esto permitirá que un administrador vea qué acciones ha realizado un usuario y cuándo. E.g 'El usuario agregó una nueva dirección', 'El usuario actualizó su código postal de X a Y'.Mantener un registro de eventos de usuario en raíles

Como cada acción podría involucrar muchos modelos, no solo el usuario, he creado un modelo de registro que tiene campos para todos los ID de otros modelos de sistema, un mensaje y un código de registro.

class CreateLogs < ActiveRecord::Migration 
    def self.up 
    create_table :logs do |t| 
     t.integer :user_id 
     t.integer :marker_id 
     t.integer :administrator_id 
     t.integer :group_id 
     t.integer :assignment_id 
     t.integer :submission_id 
     t.integer :code 
     t.text :message 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :logs 
    end 
end 

Mi preocupación es que, por ejemplo, un usuario podría (digamos) añadir una asignación a su cuenta, que se registra como

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '') 

(En algún lugar del código 342 corresponde a 'Usuario creó una nueva dirección ', por lo tanto, no es necesario el mensaje)

Obviamente, en una vista de registro, puedo extraer la información de usuario y dirección relevante de los identificadores de log/detalles, pero si este usuario o dirección se eliminaran, toda esa información no estar disponible y, al mirar hacia atrás a través de los registros, la entrada sería básica y inútil

Tiene que haber una forma mejor o algo por el estilo para ayudar a registrar eventos del sistema como este y hacer frente a posibles eliminaciones.

Como alternativa, podría almacenar toda la entrada como un mensaje de texto, pero ¿no sería realmente malo y llenar la base de datos innecesariamente?

Avíseme si algo de eso no está claro, ¡simplemente se debe haber hecho antes las acciones/eventos de registro de aplicaciones!

Gracias,

Pete

Respuesta

3

Echa un vistazo a las gemas que aparecen en ActiveRecord Versioning, probablemente es lo que necesita.

+0

Esto se ve prometedor, particularmente como el rastro del papel, pero solo puede guardar una sola versión/registro cuando se cambia un modelo ¿verdad? ¿Qué pasa si quiero especificar manualmente cada cambio individualmente? O si se realiza una acción que no necesariamente cambia un modelo pero hace algo más como enviar un correo electrónico? –

+0

Sí, el control de versiones/auditoría generalmente solo se desencadena por cambios en el registro. Si necesita registrar acciones personalizadas que no necesariamente desencadenen un cambio en la base de datos, deberá crear su propio registrador. – eugen

1

Creo que encuentra una buena solución al usar el texto sin formato en lugar de (o además de) los ID. Si está almacenando nombres de usuario y direcciones, probablemente no va a romper ninguna capacidad de almacenamiento. Esto es más o menos como lo hace un archivo de registro; escupe quién hizo qué y cuándo sucedió. No creo que esto dificulte a su DB en absoluto para almacenar algunos datos adicionales en el texto. Sin embargo, si se volviera masivo, siempre podrías mantener el valor de los registros de las últimas semanas. Tal vez tenga algún tipo de trabajo que elimine cualquier archivo de registro que tenga más de 4 semanas. Pero eso depende principalmente del nivel de logging que estés haciendo: si estás registrando cada una de las acciones que hace un usuario, entonces esto se vuelve realmente grande. Si solo está interesado en los eventos clave (usuario conectado/desconectado, creado/actualizado/eliminado algo, etc.) entonces creo que está bien almacenar el texto y limpiar de vez en cuando.

Cuestiones relacionadas