In Schienenführungen wird es folgendermaßen beschrieben:
Objekte werden zusätzlich zerstört, wenn sie zugeordnet sind
:dependent => :destroy
, und gelöscht, wenn sie zugeordnet sind:dependent => :delete_all
Richtig, cool. Aber was ist der Unterschied zwischen Zerstörung und Löschung? Ich habe beide ausprobiert und es scheint dasselbe zu tun.
ruby-on-rails
ruby
model
associations
Sergey
quelle
quelle
In einer Rails-Modellzuordnung können Sie die
:dependent
Option angeben , die eine der folgenden drei Formen annehmen kann::destroy/:destroy_all
Die zugehörigen Objekte werden neben diesem Objekt durch Aufrufen ihrerdestroy
Methode zerstört:delete/:delete_all
Alle zugehörigen Objekte werden sofort zerstört, ohne ihre:destroy
Methode aufzurufen:nullify
Die Fremdschlüssel aller zugeordneten Objekte werden auf gesetzt,NULL
ohne ihresave
Rückrufe aufzurufenquelle
:restrict
. Bei der Einstellung: einschränken kann dieses Objekt nicht gelöscht werden, wenn ihm ein Objekt zugeordnet ist.:delete
oder:destroy_all
Optionen, wie es aussieht? Die: abhängige Option erwartet entweder: destroy ,: delete_all ,: nullify oder: einschränken (: löschen):delete
und:destroy_all
Optionen existieren nicht. Allerdings gibt es Klassenmethoden auf Modelle , die aufgerufen werdendelete
unddestroy_all
so könnte es der Grund für die Verwirrung.Sehen zerstören Löschungen seiner zugehörigen Elemente , wo DELETE_ALL mehrere Daten aus Selbst Tabelle löschen können als
DELETE * FROM table where field = 'xyz'
: Abhängig mögliche Optionen:
Steuert, was mit den zugeordneten Objekten passiert, wenn deren Besitzer zerstört wird. Beachten Sie, dass diese als Rückrufe implementiert sind und Rails Rückrufe der Reihe nach ausführt. Daher können andere ähnliche Rückrufe das: abhängige Verhalten beeinflussen, und das
:dependent
Verhalten kann andere Rückrufe beeinflussen.:destroy
bewirkt, dass alle zugehörigen Objekte ebenfalls zerstört werden.:delete_all
bewirkt, dass alle zugeordneten Objekte direkt aus der Datenbank gelöscht werden (Rückrufe werden also nicht ausgeführt).:nullify
bewirkt, dass die Fremdschlüssel auf NULL gesetzt werden. Rückrufe werden nicht ausgeführt.:restrict_with_exception
bewirkt, dass eine Ausnahme ausgelöst wird, wenn Datensätze zugeordnet sind.:restrict_with_error
bewirkt, dass dem Eigentümer ein Fehler hinzugefügt wird, wenn Objekte zugeordnet sind.Wenn Sie diese
:through
Option verwenden, muss die Zuordnung im Join-Modell zu gehören gehören, und die Datensätze, die gelöscht werden, sind die Join-Datensätze und nicht die zugeordneten Datensätze.quelle
Tatsächlich besteht der Hauptunterschied darin, dass Rückrufe nicht aufgerufen werden, wenn sie
:delete_all
verwendet wurden. Bei Verwendung wird jedoch:destroy
der Rückrufstapel (:after_destroy
,:after_commit
...) ausgelöst.Wenn Sie
touch:
Deklarationen in Modellen haben, die gelöscht werden, ist es daher besser,dependent: :delete_all
eher "abhängig :: zerstören" zu verwenden.quelle