2 Stimmen

Grails - Hinzufügen von benutzerdefinierten Feldern (Spalten) zu allen Domain-Objekten - automatisch

Wenn Sie eine Domänenklasse erstellen, werden standardmäßig automatisch die Spalten "id" und "version" für alle Domänenklassen (Tabellen) hinzugefügt. Was ist, wenn ich eine Spalte hinzufügen möchte, z.B. "isChecked", und diese automatisch zu allen Domänenklassen (d.h. Tabellen) hinzugefügt werden soll, ähnlich wie die Spalten "id" und "version" hinzugefügt werden. Wie kann ich dies erreichen und auch wenn ich "isChecked" für eine bestimmte Domänenklasse nicht haben möchte, sollte ich auch in der Lage sein, dies zu tun.

Wie kann ich dies in Grail 1.3.7 tun?

Ich danke Ihnen. Jay Chandran

Edit: Kann ich mehr Input bekommen? Die vorgeschlagenen Antworten haben nicht funktioniert!

3voto

Gregg Punkte 33513

Sie könnten die Meta-Programmierung Magie, die Groovy bietet für diese Art von Dingen, aber ich würde wahrscheinlich nur gehen eine typische Route und verwenden Vererbung. Erstellen Sie eine übergeordnete Domäne, die isChecked (und alles andere, was Sie brauchen) enthält, und lassen Sie Ihre Domänen, die sie benötigen, diese Klasse erweitern.

0voto

Joshua Moore Punkte 24531

Ich würde empfehlen, ein Plugin zu erstellen, das die Artefakte Ihrer Domäne ändert (die Eigenschaft hinzufügt). Sie können mehr lesen über Plugins und Artefakte . Sie könnten dann ganz einfach eine statische Eigenschaft hinzufügen (z. B. static nochecked = true), um Domänenartefakte herauszufiltern, denen Sie die neue Eigenschaft nicht hinzufügen möchten, wie Sie es für richtig halten.

-1voto

Dónal Punkte 180956

Sie können dies mit Hilfe der Metaprogrammierung tun. Der Code, der die Eigenschaft hinzufügt, sollte entweder in der doWithDynamicMethods Schließung eines Plugins oder von Bootstrap.groovy . Wenn Sie den Plugin-Ansatz verwenden, sollte dies in etwa so funktionieren:

def doWithDynamicMethods = {ctx ->
  application.domainClasses
        .findAll {it.simpleName.startsWith('S')}.metaClass.each {domainMetaClass ->

    Integer fooVal = 0

    domainMetaClass.getFoo = {-> fooVal}
    domainMetaClass.setFoo = {Integer newFooVal -> fooVal = newFooVal}
  }
}

Der obige Code sollte eine Integer foo Eigenschaft zu jeder Domänenklasse, deren Name mit 'S' beginnt. Ich habe diesen Code nicht getestet, daher funktioniert er wahrscheinlich nicht. Um ein Beispiel zu sehen, dem Sie mehr Vertrauen schenken können:

  1. Finden Sie ein Plugin, das Domänenklassen hinzufügt, die sie verändern (z. B. ein Feld oder eine Methode hinzufügen)
  2. Herunterladen
  3. Sehen Sie sich den Code im Plugin-Deskriptor unter doWithDynamicMethods Verschluss
  4. Kopieren, einfügen und an Ihre Bedürfnisse anpassen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X