Jak usunąć obiekt ActiveRecord?
Spojrzałem na Active Record Querying i nie ma nic do usunięcia, co widzę.
Usuń przez
id
,Usuń bieżący obiekt jak:
user.remove
,Czy możesz usunąć na podstawie
where
klauzuli?
Jak usunąć obiekt ActiveRecord?
Spojrzałem na Active Record Querying i nie ma nic do usunięcia, co widzę.
Usuń przez id
,
Usuń bieżący obiekt jak: user.remove
,
Czy możesz usunąć na podstawie where
klauzuli?
Odpowiedzi:
To destroy
i destroy_all
metody
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ć delete
i delete_all
który nie będzie egzekwować :before_destroy
i :after_destroy
zwrotnych ani żadnych opcji zależnych stowarzyszeniu.
User.delete_all(condition: 'value')
pozwoli ci usunąć rekordy bez klucza podstawowego
Uwaga : z komentarza @ hammady user.destroy
nie będzie działać, jeśli model użytkownika nie ma klucza podstawowego.
Uwaga 2 : Z komentarza @ pavel-chuchuva, destroy_all
warunki i delete_all
warunki zostały wycofane w Rails 5.1 - patrz guide.rubyonrails.org/5_1_release_notes.html
User.find_by(username:"bob")
jest dobre do identyfikacji rekordu zniszczyć lub usunąć, zbyt.
Jest delete
, delete_all
, destroy
, i destroy_all
.
Dokumenty to: starsze dokumenty i dokumenty Rails 3.0.0
delete
nie tworzy obiektów, podczas gdy destroy
robi. Ogólnie rzecz biorąc, delete
jest szybszy niż destroy
.
delete
jest szybszy, ale omija wywołania zwrotne, które mogłeś zdefiniować w modelu
User.destroy
User.destroy(1)
usunie użytkownikowi id == 1
i :before_destroy
i :after_destroy
wystą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ą.
User.destroy
, User.delete
User.destroy_all(<conditions>)
lub User.delete_all(<conditions>)
Uwaga : Użytkownik jest klasą, a użytkownik jest obiektem instancji
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.