Jak usunąć obiekt ActiveRecord?

328

Jak usunąć obiekt ActiveRecord?

Spojrzałem na Active Record Querying i nie ma nic do usunięcia, co widzę.

  1. Usuń przez id,

  2. Usuń bieżący obiekt jak: user.remove,

  3. Czy możesz usunąć na podstawie whereklauzuli?

Blankman
źródło

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

Marek Sapota
źródło
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.

niepolarność
źródło
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

Tadas T.
źródło
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