Jak usunąć obiekt ActiveRecord?


Odpowiedzi:


572

To destroyi destroy_allmetody

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

Alternatywnie można użyć deletei delete_allktóry nie będzie egzekwować :before_destroyi :after_destroyzwrotnych ani żadnych opcji zależnych stowarzyszeniu.

User.delete_all(condition: 'value') pozwoli ci usunąć rekordy bez klucza podstawowego

Uwaga : z komentarza @ hammady user.destroynie będzie działać, jeśli model użytkownika nie ma klucza podstawowego.

Uwaga 2 : Z komentarza @ pavel-chuchuva, destroy_allwarunki i delete_allwarunki zostały wycofane w Rails 5.1 - patrz guide.rubyonrails.org/5_1_release_notes.html


4
Byłoby miło, gdybyś mógł dołączyć komentarz @ hammady do swojej odpowiedzi. Z
trudem odkryłem


Dlaczego aktualizuje tylko dane kolumny usunięte_w mojej bazie danych? Jak mogę usunąć cały wiersz danych?
TommyQu

1
destroy_all z warunkami i delete_all z warunkami jest przestarzałe w Rails 5.1 - patrz guide.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva

to User.find_by(username:"bob") jest dobre do identyfikacji rekordu zniszczyć lub usunąć, zbyt.
barlop

60

Jest delete, delete_all, destroy, i destroy_all.

Dokumenty to: starsze dokumenty i dokumenty Rails 3.0.0

deletenie tworzy obiektów, podczas gdy destroyrobi. Ogólnie rzecz biorąc, deletejest szybszy niż destroy.


4
deletejest szybszy, ale omija wywołania zwrotne, które mogłeś zdefiniować w modelu
Rudi

48
  1. User.destroy

User.destroy(1)usunie użytkownikowi id == 1i :before_destroyi :after_destroywystąpić wywołania zwrotne. Na przykład, jeśli masz powiązane rekordy

has_many :addresses, :dependent => :destroy

Po zniszczeniu użytkownika jego adresy również zostaną zniszczone. Jeśli zamiast tego użyjesz akcji usuwania, wywołania zwrotne nie wystąpią.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) lub User.delete_all(<conditions>)

Uwaga : Użytkownik jest klasą, a użytkownik jest obiektem instancji


3
Dziękujemy za zajęcie się powiązanymi rekordami.
Sage Mitchell

2
UWAGA: User.destroy_all()uruchamia wywołania zwrotne, więc zanim cokolwiek usunie, ładuje rekordy. To dwie instrukcje SQL, a nie jedna. Oprócz wpływu na wydajność ma to również wpływ na współbieżność. Bezpieczniejsze połączenie pomija połączenia zwrotne; User.delete_all()wyda tylko jedno DELETE FROM...polecenie.
Andrew Hodgkinson,

1
destroy_all z warunkami został wycofany w Rails 5.1 - patrz guide.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.