2010-11-22 11 views
0

Verwandte Objekte einer m: n-Relation können mit einem HTML-Select-Element in meiner Anwendung ausgewählt werden (könnte auch eine Liste von Checkboxen sein). Wenn alle zugehörigen Objekte im Bearbeitungsformular deaktiviert sind, sollte die Objektliste der zugehörigen Objekte gelöscht werden. Mit Scaffold-Code funktioniert es nur, wenn mindestens ein verwandtes Objekt übrig bleibt.Grails: alle zugehörigen Objekte entfernen

Beispiel:

class Book { 
    String name 
    static hasMany = [authors: Author] 
    belongsTo = Author 
} 

class Author { 
    String name 
    static hasMany = [books: Book] 
} 

def b1 = new Book(name: "B1").save() 
def b2 = new Book(name: "B2").save() 
def author = new Author(name: "Stephen").addToBooks(b1).addToBooks(b2).save() 

// How to remove all books from the author? 

der Grails doc Nach würde ich für alle zugehörigen Objekte removeFrom* (das Gegenteil von dem addTo*) auf dem Domäne-Objekt aufrufen. Aber um das zu tun, musste ich herausfinden, welche Objekte verwandt sind. Gibt es eine einfachere Möglichkeit, die Liste verwandter Objekte zu löschen? Würde die bidirektionale Verknüpfung korrekt gehandhabt, wenn die Liste verwandter Objekte einfach durch eine leere Liste ersetzt würde?

Antwort

2

Ich denke, das Problem, das Sie möglicherweise erfahren, ist, dass, wenn so ein Element entweder in der Auswahlbox oder über Kontrollkästchen ausgewählt wird, keine Daten mit der Anfrage an den Controller zurückkommen. Wenn Sie alle Objekte aus der Assoziation entfernen möchten, müssen Sie dem Formular ein zusätzliches verstecktes Feld hinzufügen.

Zum Beispiel, wenn es ein Produkt, das viele Kategorien fügen Sie Folgendes hat:

<g:hiddenField name="categories" value=""/> 

abgesehen von den üblichen select.

Sie können einen Test für den Controller schreiben, um sicherzustellen, dass sich die gewünschte Funktionalität wie erwartet verhält.

Verwandte Themen