Was ist der Unterschied zwischen
@model.destroy
und @model.delete
Beispielsweise:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Ist es wirklich wichtig, ob ich das eine oder das andere benutze?
quelle
Was ist der Unterschied zwischen
@model.destroy
und @model.delete
Beispielsweise:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Ist es wirklich wichtig, ob ich das eine oder das andere benutze?
Grundsätzlich werden destroy
keine Rückrufe auf dem Modell ausgeführt, während delete
dies nicht der Fall ist.
Aus der Rails-API :
ActiveRecord::Persistence.delete
Löscht den Datensatz in der Datenbank und friert diese Instanz ein, um anzuzeigen, dass keine Änderungen vorgenommen werden sollten (da sie nicht beibehalten werden können). Gibt die eingefrorene Instanz zurück.
Die Zeile wird einfach mit einer SQL DELETE-Anweisung auf dem Primärschlüssel des Datensatzes entfernt, und es werden keine Rückrufe ausgeführt.
Verwenden Sie #destroy, um die Rückrufe vor_destroy und after_destroy des Objekts oder andere: abhängige Zuordnungsoptionen zu erzwingen.
ActiveRecord::Persistence.destroy
Löscht den Datensatz in der Datenbank und friert diese Instanz ein, um anzuzeigen, dass keine Änderungen vorgenommen werden sollten (da sie nicht beibehalten werden können).
Es gibt eine Reihe von Rückrufen, die mit Zerstörung verbunden sind. Wenn der Rückruf before_destroy false zurückgibt, wird die Aktion abgebrochen und destroy gibt false zurück. Weitere Informationen finden Sie unter ActiveRecord :: Callbacks.
model#before_destroy
kann verwendet werden, um den letztendestroy()
Anruf unter bestimmten Bedingungen anzuhalten.delete
löscht nur den aktuellen Objektdatensatz aus der Datenbank, nicht jedoch die zugehörigen untergeordneten Datensätze aus der Datenbank.destroy
löscht den aktuellen Objektdatensatz aus der Datenbank und den zugehörigen untergeordneten Datensatz aus der Datenbank.Ihre Verwendung ist wirklich wichtig:
Wenn mehrere übergeordnete Objekte gemeinsame untergeordnete Objekte verwenden, werden durch Aufrufen eines
destroy
bestimmten übergeordneten Objekts untergeordnete Objekte gelöscht, die von mehreren übergeordneten Objekten gemeinsam genutzt werden .quelle
destroy
sind Nachkommen , keine Kinder : Gemäß der Dokumentation erstellt destroy "ein neues Objekt aus den Attributen und ruft dann destroy darauf auf". rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyWenn Sie ein Objekt aufrufen
destroy
oderdestroy_all
einActiveRecord
Objekt aufrufen , wird derActiveRecord
Zerstörungsprozess eingeleitet, die zu löschende Klasse analysiert, festgelegt, was für Abhängigkeiten getan werden soll, Überprüfungen durchlaufen usw.Wenn Sie ein Objekt aufrufen
delete
oderdelete_all
bearbeiten, wirdActiveRecord
lediglich versucht, dieDELETE FROM tablename WHERE conditions
Abfrage für die Datenbank auszuführen , ohne dassActiveRecord
Aufgaben auf anderer Ebene ausgeführt werden.quelle
Ja, es gibt einen großen Unterschied zwischen den beiden Methoden. Verwenden Sie delete_all, wenn Datensätze schnell gelöscht werden sollen, ohne dass Modellrückrufe aufgerufen werden
Wenn Sie sich für Rückrufe Ihrer Modelle interessieren, verwenden Sie destroy_all
Aus den offiziellen Dokumenten
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
quelle
Grundsätzlich sendet "Löschen" eine Abfrage direkt an die Datenbank, um den Datensatz zu löschen. In diesem Fall weiß Rails nicht, welche Attribute in dem zu löschenden Datensatz enthalten sind oder ob Rückrufe (z. B.
before_destroy
) vorliegen .Die "destroy" -Methode nimmt die übergebene ID, ruft das Modell mit der "find" -Methode aus der Datenbank ab und ruft dann destroy auf. Dies bedeutet, dass die Rückrufe ausgelöst werden.
Sie möchten "Löschen" verwenden, wenn Sie nicht möchten, dass die Rückrufe ausgelöst werden, oder wenn Sie eine bessere Leistung wünschen. Andernfalls (und meistens) möchten Sie "destroy" verwenden.
quelle
Viele Antworten schon; wollte mit etwas mehr weitermachen.
docs :
Das
delete
Verb funktioniert anders fürActiveRecord::Association.has_many
undActiveRecord::Base
. Für letzteres führt deleteSQL DELETE
alle Überprüfungen / Rückrufe aus und umgeht sie. Ersteres wird basierend auf der:dependent
an den Verein übergebenen Option ausgeführt . Beim Testen stellte ich jedoch den folgenden Nebeneffekt fest, bei dem Rückrufe nur ausgeführt wurdendelete
und nichtdelete_all
dependent: :destroy
Beispiel:quelle