Frage

Für ein Projekt, an dem ich gerade arbeite, muss ich Objektversioning implementieren. Leider muss ich eine vollständige Geschichte jedes Objekts aufbewahren, sodass eine einzelne Tischlösung wie Papertrail schnell nicht verwirrbar wird. Es gibt jedoch Merkmale von Papertrail, die mir jedoch gefallen, die ich in einer Lösung mit einzelnen Tabellen für jedes Modell nicht finden konnte (z. B. ACTS_AS_VERSIONED).

  • Fähigkeit, Meta-Information sowohl von Controller als auch von Modell zu speichern
  • Die Daten werden serialisiert, sodass Schemaänderungen die Versionstabelle nicht ändern können
  • Leistungsstarke Methoden zum Durchqueren von Versionen
  • Automatische Verfolgung der Verantwortung der Veränderung

Es gibt auch einige Funktionen, die Papertrail nicht hat, was Boni wären:

  • Integrierte Version Diff Support
  • Differential statt vollen Versionen

Ich erwähne derzeit, Papiertrail für jedes Modell einzelne Tabellen zu verwenden, möchte diese Anstrengung jedoch speichern, wenn es eine vorhandene Lösung gibt.

Aktualisieren:Vestal -Versionen verwendet standardmäßig eine einzelne Tabelle. Durch die Bereitstellung einer benutzerdefinierten Versionsklasse für jedes Modell und die Verwendung der Methode "set_table_name" von activerecord konnte ich für jedes Modell separate Tabellen erstellen. Vestal -Versionen haben auch Diff -Unterstützung eingebaut, obwohl ihre Schnittstelle nicht so leistungsfähig ist wie Papertrails. Es fehlt auch die Unterstützung der Vereinigung.

Update 2:Da PaperTrail ein aktiveres Projekt zu sein scheint, habe ich das Edelstein gegeben und in benutzerdefinierte Klassenunterstützung hinzugefügt, ähnlich wie Vestal -Versionen, die nun die Möglichkeit ermöglichen, separate Tabellen pro Modell zu definieren. Meine Gabel ist hier, aber ich hoffe, dass sie in Kürze in das Hauptprojekt -Repository gezogen wird.https://github.com/benzittlau/paper_trail

War es hilfreich?

Lösung

Sie können benutzerdefinierte Versionsunterklassen mit der Option: class_name angeben:

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

Auf diese Weise können Sie die Versionen jedes Modells in einer separaten Tabelle speichern. Dies ist nützlich, wenn viele Versionen erstellt werden.

Andere Tipps

Ich habe verwendet Vestal -Versionen, ein Rails -Edelstein/Plugin, das das Memento -Muster verwendet, um eine Verlaufstabelle zu erstellen, und es spart einen Diff von Attributen in After_Save und After_Destroy -Rückern.

Es wird auch aufgezeichnet, wenn es geändert wurde, und erhöht eine Versionsnummer, sodass Sie zu einer bestimmten Version oder einer Version zu einem bestimmten Zeitpunkt oder zu einer bestimmten Uhrzeit rollen können.

Ich kann dann ein Objekt wie so hochziehen:

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

Ich bin ein ziemlich großer Fan.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top