delete_all vs destroy_all?
Ich bin auf der Suche nach dem besten Ansatz zum löschen von Datensätzen aus einer Tabelle. Zum Beispiel habe ich einen Benutzer, dessen Benutzer-ID ist über viele Tabellen. Ich möchte zu löschen, diese Nutzer und jeder Datensatz mit seiner ID in allen Tabellen.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
Dies funktioniert, und entfernt alle Referenzen der Anwender aus allen Tabellen, aber ich habe gehört, dass destroy_all
Prozess war sehr schwer, so versuchte ich delete_all
. Es entfernt nur die Benutzer von seiner eigenen user-Tabelle und die id
von allen anderen Tabellen sind null, aber die Blätter der Aufzeichnungen intakt. Kann jemand teilen, was der richtige Prozess ist für die Durchführung einer Aufgabe wie diese?
Sehe ich, dass destroy_all
ruft die destroy
Funktion auf alle zugeordneten Objekte, aber ich will einfach nur, um zu bestätigen, den richtigen Ansatz.
InformationsquelleAutor der Frage glogic | 2011-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig. Wenn Sie möchten, löschen Sie den Benutzer und alle zugeordneten Objekte ->
destroy_all
Allerdings, wenn Sie nur wollen, um den Benutzer zu löschen, ohne Unterdrückung der alle zugeordneten Objekte, die ->
delete_all
Laut diesem post : Schienen :dependent =>: destroy VS :dependent =>: delete_all
destroy
/destroy_all
: Die zugehörigen Objekte sind zerstört, neben diesem Objekt durch den Aufruf Ihrer Methode destroydelete
/delete_all
: Alle zugeordneten Objekte, die zerstört werden, sind sofort ohne Aufruf Ihre :destroy-MethodeInformationsquelleAutor der Antwort Sandro Munda
delete_all ist eine einzelne SQL-DELETE-Anweisung, und nichts mehr. destroy_all ruft destroy() auf alle matching-Ergebnisse :die Bedingungen (falls Sie eine haben), die mindestens NUM_OF_RESULTS SQL-Anweisungen.
Wenn Sie haben, etwas zu tun drastische wie destroy_all() auf große datasets, ich würde wahrscheinlich nicht machen es aus der app und behandeln Sie manuell mit Sorgfalt. Falls der Datensatz ist klein genug, Sie würde nicht so weh.
InformationsquelleAutor der Antwort Ryan Her
Zu vermeiden, die Tatsache, dass
destroy_all
instanziiert alle Datensätze und zerstört Sie nacheinander, Sie können es verwenden, direkt aus der Modell-Klasse.Also statt :
Können Sie tun :
Ist das Ergebnis einer Abfrage zu zerstören, werden alle zugehörigen Datensätze
InformationsquelleAutor der Antwort simon-olivier
Habe ich eine kleines Juwel , kann lindern die Notwendigkeit, manuell zu löschen zugehörigen Datensätze in einigen Fällen.
InformationsquelleAutor der Antwort Janosch