2014-01-13 7 views
13

Ich bin auf der Suche nach dem besten Ansatz, um die Grails CRUD-Generation-Funktionalität zu erweitern. Es sollte ein Grails Plugin sein, die für folgende Funktionen zusätzliche Generatoren bietet:Versioning Domain-Instanzen für die Genehmigung in Grails

  • Alle Änderungen auf erweiterten Domain-Instanz sollte (als Version davon) gespeichert werden für Geschichte
  • nur eine Version einer Instanz kann sein aktiv
  • Benutzer sollten aktivieren Lage sein, eine Version der Instanz (soll die derzeit aktive Instanz deaktiviert werden), die nicht von ihm (4-Augen-Prinzip)
  • eine diff Ansicht schön erstellt wird, ist zu haben

Der Eingriff in Grails Skripte sollte so klein wie möglich sein. I identifiziert bisher 3 Design-Strategien für die Umsetzung:

  1. Spiegel Tabelle mit demselben Schema, welche Versionen enthält (verdoppelt die Anzahl der Domänen/Tabellen). Die aktivierte Version wird in die native Domain kopiert und umgekehrt.
  2. Verwenden von Diskriminator in der Domänenklasse. Einige neue Spalten werden auf der Domäne hinzugefügt werden (wie Zustand [aktiv, notActive], lastUpdatedBy, lastUpdatedDate ...)
  3. (De-) Serialisierung Instanzen auf eine spezielle Domäne mit BLOB (zB domain.properties als JSON)

Jede der Lösungen hat Vor- und Nachteile. Was ist der beste Ansatz, um es zu implementieren? Vielleicht gibt es einen einfacheren Weg.

+5

Haben Sie es noch nie versucht, aber Sie finden http://refaktor.blogspot.co.uk/2012/08/hibernate-envers-with-grails-210.html interessant? –

+3

@tim_yates bitte posten Sie es als Antwort, damit ich es akzeptieren kann. In Ihrem Vorschlag wird ein Hibernate-Plugin namens Envers verwendet. Es implementiert die 1. Strategie, die in meiner Frage beschrieben wird. Es funktioniert gut. Der einzige Nachteil ist, dass die Änderung der Datenbank innerhalb einer Transaktion erfolgen muss, was bei einem Controller nicht der Fall ist. – Waldemar

+0

Unabhängig von den Strategien ist es eine gute Idee, das dynamische Gerüst in Grails zu verwenden, um sie zu implementieren. Erstellen Sie für jede Domäne, die Sie benötigen, einen leeren Controller mit scaffold = true. Dann installiere Vorlagen und modifiziere sie. Z.B. Aktion ändern, um die inaktiven Objekte herauszufiltern. – Waldemar

Antwort

2

Ich habe ein System in Grails entwickelt, das intensiv das Versionskonzept nutzt (wie Sie oben beschrieben haben). Mein Ansatz war der zweite in Ihrer Frage aufgeführt.

Ich habe zwei Felder erstellt: interneVersion e deaktiviert. Jede Klasse, die versionierbar sein muss, muss eine Schnittstelle namens "Versionable" implementieren.

Ich werde versuchen, erklären Sie hier eines der Szenarien, die es notwendig ist, die Version Funktionalität zu verwenden (verzeihen Sie mein Englisch).

Das System, das dieses Konzept verwendet, ist ein kommerzielles System, in dem es eine Klasse namens Quote gibt.

Jedes Angebot kann eine oder mehrere Versionen haben, in denen nur die letzte Version gültig ist. Jedes Angebot und seine Versionen werden basierend auf Verhandlungen mit einem bestimmten Kunden generiert. Auf diese Weise fragt uns ein Kunde ein Angebot und wenn ihm die Preise aus irgendeinem Grund nicht gefallen (zum Beispiel), können wir eine neue Version mit etwas Rabatt erstellen. Jedes Angebot hat einen eindeutigen Code, der der aktuellen Version folgt, zum Beispiel: QT-000022/0 (erste Version), QT-000022/1 (zweite Version).

Um eine neue Version zu generieren, verwende ich eine Methode, die das aktuelle Objekt klont (mit einer Art vollständigen und tiefen Speichern unter). Ich kopiere alles (Eigenschaften und Sammlungen) auf ein neues Objekt.

Die Klon-Methode identifiziert, dass die Klasse des versionierbar-Schnittstelle implementiert und führt Folgendes aus:

oldQuote.disabled = true 
newQuote.internalVersion = oldQuote.internalVersion + 1 

Auf diese Weise möglich, es ist sicher, dass nur eine Version aktiviert werden.

Ich hoffe, Sie verstehen meine Vorgehensweise.

+0

Zum Überschreiben der Klon-Methode ist eine gute Idee. Wenn Sie einen Index für die Spalten erstellen, treten keine Leistungsprobleme auf. Sie haben immer noch den Nachteil der 2. Option, dass sie für die Anwendung nicht transparent ist. Bei jeder Abfrage sollte mindestens die Spalte "deaktiviert" berücksichtigt werden. – Waldemar