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:
- 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.
- Verwenden von Diskriminator in der Domänenklasse. Einige neue Spalten werden auf der Domäne hinzugefügt werden (wie Zustand [aktiv, notActive], lastUpdatedBy, lastUpdatedDate ...)
- (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.
Haben Sie es noch nie versucht, aber Sie finden http://refaktor.blogspot.co.uk/2012/08/hibernate-envers-with-grails-210.html interessant? –
@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
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