Ich suche nach dem besten Ansatz, um Datensätze aus einer Tabelle zu löschen. Zum Beispiel habe ich einen Benutzer, dessen Benutzer-ID sich über viele Tabellen erstreckt. Ich möchte diesen Benutzer und jeden Datensatz löschen, der seine ID in allen Tabellen hat.
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 des Benutzers aus allen Tabellen, aber ich habe gehört, dass dies destroy_all
sehr prozesslastig war, also habe ich es versucht delete_all
. Es entfernt nur den Benutzer aus seiner eigenen Benutzertabelle und die id
aus allen anderen Tabellen werden auf null gesetzt, die darin enthaltenen Datensätze bleiben jedoch erhalten. Kann jemand mitteilen, was der richtige Prozess für die Ausführung einer solchen Aufgabe ist?
Ich sehe, dass destroy_all
die destroy
Funktion für alle zugeordneten Objekte aufgerufen wird, aber ich möchte nur den richtigen Ansatz bestätigen.
quelle
delete_all
und 2)destroy_all
alle Datensätze instanziiert und einzeln zerstört werden. Bei einem sehr großen Datensatz kann dies daher schmerzhaft langsam sein.delete_all ist eine einzelne SQL DELETE-Anweisung und nichts weiter. destroy_all ruft destroy () für alle übereinstimmenden Ergebnisse von: Bedingungen (falls vorhanden) auf, bei denen es sich um mindestens NUM_OF_RESULTS SQL-Anweisungen handeln kann.
Wenn Sie etwas drastisches wie destroy_all () für große Datenmengen tun müssen, würde ich es wahrscheinlich nicht über die App tun und es manuell mit Sorgfalt behandeln. Wenn der Datensatz klein genug ist, würden Sie nicht so viel verletzen.
quelle
Um zu vermeiden, dass
destroy_all
alle Datensätze instanziiert und einzeln zerstört werden, können Sie sie direkt aus der Modellklasse verwenden.Also statt:
Du kannst tun :
Das Ergebnis ist eine Abfrage, um alle zugehörigen Datensätze zu zerstören
quelle
UsageIndex.destroy_all
gleichwertig mitUsageIntex.delete_all
?UsageIndex.destroy_all
ist nicht mehr verfügbar seit Schienen 3Ich habe ein kleines Juwel gemacht , das die Notwendigkeit verringern kann, zugeordnete Datensätze unter bestimmten Umständen manuell zu löschen.
quelle