Szukam najlepszego podejścia do usuwania rekordów z tabeli. Na przykład mam użytkownika, którego identyfikator użytkownika znajduje się w wielu tabelach. Chcę usunąć tego użytkownika i każdy rekord, który ma swój identyfikator we wszystkich tabelach.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
To działa i usuwa wszystkie referencje użytkownika ze wszystkich tabel, ale słyszałem, że destroy_all
było to bardzo obciążające proces, więc spróbowałem delete_all
. Usuwa tylko użytkownika ze swojej własnej tabeli użytkowników, a id
wszystkie pozostałe tabele są zerowane, ale pozostawiają w nich nienaruszone rekordy. Czy ktoś może udostępnić prawidłowy proces wykonywania takiego zadania?
Widzę, że destroy_all
wywołuje destroy
funkcję na wszystkich powiązanych obiektach, ale chcę tylko potwierdzić prawidłowe podejście.
źródło
delete_all
, oraz 2)destroy_all
tworzy wszystkie rekordy i niszczy je pojedynczo, więc przy bardzo dużym zestawie danych może to być boleśnie powolne.delete_all to pojedyncza instrukcja SQL DELETE i nic więcej. wywołania destroy_all destroy () na wszystkich pasujących wynikach: warunków (jeśli je masz), które mogą być co najmniej NUM_OF_RESULTS instrukcjami SQL.
Jeśli musisz zrobić coś drastycznego, np. Destroy_all () na dużym zestawie danych, prawdopodobnie nie zrobiłbym tego z aplikacji i nie obchodziłbym się z nim ręcznie. Jeśli zestaw danych jest wystarczająco mały, nie zaszkodziłbyś tak bardzo.
źródło
Aby uniknąć faktu, że
destroy_all
tworzy on wszystkie rekordy i niszczy je pojedynczo, możesz użyć go bezpośrednio z klasy modelu.Więc zamiast:
Możesz to zrobić :
Wynikiem jest jedno zapytanie, aby zniszczyć wszystkie powiązane rekordy
źródło
UsageIndex.destroy_all
równoważne zUsageIntex.delete_all
?UsageIndex.destroy_all
nie jest już dostępny, ponieważ szyny 3Zrobiłem mały klejnot, który może w niektórych okolicznościach zmniejszyć potrzebę ręcznego usuwania powiązanych rekordów.
źródło