Pregunta

Para un proyecto en el que estoy trabajando actualmente, necesito implementar versiones de objetos. Desafortunadamente, necesito mantener un historial completo de cada objeto, por lo que una solución de tabla única como PaperTrail se volvería rápidamente manejable. Sin embargo, hay características de PaperTrail que me gustan, que no he podido encontrar en una solución con tablas individuales para cada modelo (como ACTS_AS_VERSIONED).

  • Capacidad para almacenar metainformación tanto del controlador como del modelo
  • Los datos se serializan para que los cambios de esquema no modifiquen la tabla de versiones
  • Métodos poderosos para atravesar versiones
  • Seguimiento automático de la responsabilidad del cambio

También hay algunas características que PaperTrail no tiene que serían bonificaciones:

  • Soporte de diferencia de versión incorporada
  • Diferencial en lugar de versiones completas

Actualmente estoy considerando bifurcar PaperTrail para usar tablas individuales para cada modelo, pero me gustaría guardar ese esfuerzo si hay una solución existente.

Actualizar:Vestal Versiones de forma predeterminada usa una sola tabla, pero al proporcionar una clase de versión personalizada para cada modelo y utilizando el método "set_table_name" de Activerecord, pude crear tablas separadas para cada modelo. Vestal Versions también ha incorporado el soporte DiFF, aunque su interfaz no es tan potente como PaperTrails. También carece de apoyo de asociación.

Actualización 2:Como PaperTrail parece ser un proyecto más activo, he bifurcado la gema y he agregado un soporte de clase personalizado similar a las versiones Vestal que ahora permite la capacidad de definir tablas separadas por modelo. Mi bifurcación está aquí, pero espero que se lleve al repositorio principal del proyecto en breve.https://github.com/benzittlau/paper_trail

¿Fue útil?

Solución

Puede especificar subclases de versión personalizada con la opción: class_name:

class Post < ActiveRecord::Base
  has_paper_trail :class_name => 'PostVersion'
end

class PostVersion < Version
  # custom behaviour, e.g:
  self.table_name = :post_versions # in rails 2, use set_table_name
end

Esto le permite almacenar las versiones de cada modelo en una tabla separada, lo cual es útil si se está creando muchas versiones.

Otros consejos

He estado usando Versiones de Vestal, una gema/complemento Rails que utiliza el patrón Memento para crear una tabla de historial, y guarda una diferencia de atributos en las devoluciones de llamada después de_save y después de_destroy.

También registra cuando se cambió e incrementa un número de versión para que pueda revertir a una determinada versión o una versión presente en una cierta fecha o hora.

Luego puedo levantar un objeto como así:

@user = User.last
@user.versions.last.changes #=> {:name => ['Robert','Bob']}

Soy un gran admirador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top