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?
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 .
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 .
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.
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.
Tags und Links ruby-on-rails activerecord