Speichern Sie Änderungen nur dann in einer has_many-Zuordnung, wenn Sie das übergeordnete Objekt erfolgreich gespeichert haben?

8

Angenommen, jedes Project has_many Tasks .

Wenn ich das tue

%Vor%

Die Aufgaben des Projekts werden aktualisiert, auch wenn das Speichern fehlschlägt. Wenn list_of_tasks aus neuen Datensätzen besteht, werden die Aufgaben des Projekts gelöscht , auch wenn das Speichern fehlschlägt! WHOA!

Wenn das Speichern fehlschlägt, sollte das Projekt die gleichen Aufgaben haben, die es hatte, bevor ich damit angefangen habe. Wie bekomme ich dieses Verhalten und warum ist es nicht die Standardeinstellung?

    
Tom Lehman 06.11.2010, 01:06
quelle

4 Antworten

8

Schließen Sie die Anweisungen in einer Transaktion ein:

%Vor%

Die Methode save! löst bei einem Fehler eine Ausnahme aus, bei der Änderungen an der Aufgabenliste rückgängig gemacht werden.

Sie können die Dokumentation lesen, wenn Sie ein wenig tiefer in das Thema eintauchen möchten .

    
Harish Shetty 06.11.2010, 01:22
quelle
3

Ich glaube, dass access_nested_attributes_for () das gewünschte Verhalten bietet:

%Vor%

Dies sollte alles innerhalb einer Transaktion umbrechen. Sie müssen dann das Formular erstellen, das die Aufgaben entsprechend auffüllt. Die Methode tasks_attributes in Ihrem Projektmodell wird anstelle der Methode tasks aufgerufen. Weitere Informationen finden Sie in der API .

    
adamlamar 13.04.2011 22:42
quelle
3

Sie können feststellen, dass die Funktion AutosaveAssociation genau das tut, was Sie möchten.

%Vor%

Dies sollte die Sicherung automatisch in eine Transaktion einschließen.

    
adamlamar 15.04.2011 03:11
quelle
0

Bevor Sie #save aufrufen, können Sie fragen, ob some_project#valid? . Das hilft, wenn das Speichern fehlschlägt, weil some_project ein ungültiger Datensatz ist, aber keine umfassende Lösung.

Was das Standardverhalten der Rails betrifft, ist es sinnvoll. Das sagen some_project.tasks = list_of_tasks ist so, als würde man "alle existierenden Aufgaben aus einem Projekt entfernen und diese neuen zuweisen". Sie löschen den Verweis auf das vorhandene Assoziationsarray und weisen ihm einen neuen zu. Dies wird von ActiveRecord in der DB widergespiegelt.

    
Chris 06.11.2010 01:11
quelle

Tags und Links