Jaka jest różnica pomiędzy
@model.destroy
i @model.delete
Na przykład:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Czy to naprawdę ważne, czy korzystam z jednego, czy drugiego?
źródło
Jaka jest różnica pomiędzy
@model.destroy
i @model.delete
Na przykład:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Czy to naprawdę ważne, czy korzystam z jednego, czy drugiego?
Zasadniczo destroy
uruchamia wszelkie wywołania zwrotne w modelu, podczas gdy delete
nie.
ActiveRecord::Persistence.delete
Usuwa rekord w bazie danych i zawiesza to wystąpienie, aby pokazać, że nie należy wprowadzać żadnych zmian (ponieważ nie można ich utrwalić). Zwraca zamrożoną instancję.
Wiersz jest po prostu usuwany za pomocą instrukcji SQL DELETE na kluczu podstawowym rekordu i żadne wywołania zwrotne nie są wykonywane.
Aby wymusić wywołania zwrotne before_destroy i after_destroy obiektu lub dowolne: zależne opcje asocjacji, użyj #destroy.
ActiveRecord::Persistence.destroy
Usuwa rekord w bazie danych i zawiesza to wystąpienie, aby pokazać, że nie należy wprowadzać żadnych zmian (ponieważ nie można ich utrwalić).
Istnieje szereg wywołań zwrotnych związanych ze zniszczeniem. Jeśli wywołanie zwrotne before_destroy zwróci wartość false, akcja zostanie anulowana, a zniszczenie zwróci wartość false. Zobacz ActiveRecord :: Callbacki w celu uzyskania dalszych szczegółów.
model#before_destroy
możliwość zatrzymaniadestroy()
połączenia końcowego pod pewnymi warunkami.delete
usunie tylko bieżący rekord obiektu z db, ale nie skojarzy z nim powiązanych rekordów potomnych.destroy
usunie bieżący rekord obiektu z db, a także powiązany z nim rekord potomny z db.Ich użycie naprawdę ma znaczenie:
Jeśli wiele obiektów nadrzędnych korzysta ze wspólnych obiektów podrzędnych, wówczas wywołanie
destroy
określonego obiektu nadrzędnego spowoduje usunięcie obiektów podrzędnych, które są współużytkowane przez innych wielu rodziców.źródło
destroy
są potomkowie , a nie dzieci : zgodnie z dokumentacją zniszcz „tworzy nowy obiekt z atrybutów, a następnie wywołuje na nim zniszczenie”. rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyPodczas wywoływania
destroy
lubdestroy_all
naActiveRecord
obiekcieActiveRecord
inicjowany jest proces „niszczenia”, analizuje usuwaną klasę, określa, co powinien zrobić dla zależności, uruchamia sprawdzanie poprawności itp.Podczas wywoływania
delete
lubdelete_all
na obiekcie,ActiveRecord
po prostu próbuje uruchomićDELETE FROM tablename WHERE conditions
zapytanie względem bazy danych, nie wykonując żadnych innychActiveRecord
zadań na tym samym poziomie.źródło
Tak, istnieje zasadnicza różnica między dwiema metodami Użyj delete_all, jeśli chcesz, aby rekordy były szybko usuwane bez wywoływania wywołań zwrotnych modelu
Jeśli zależy Ci na wywołaniach zwrotnych swoich modeli, użyj funkcji destroy_all
Z oficjalnych dokumentów
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
źródło
Zasadniczo „usuń” wysyła zapytanie bezpośrednio do bazy danych w celu usunięcia rekordu. W takim przypadku Railsy nie wiedzą, jakie atrybuty znajdują się w rekordzie, który usuwa, ani nie ma żadnych wywołań zwrotnych (takich jak
before_destroy
).Metoda „zniszczyć” pobiera przekazany identyfikator, pobiera model z bazy danych przy użyciu metody „znajdź”, a następnie wywołuje na nim funkcję zniszczenia. Oznacza to, że wywołania zwrotne są wyzwalane.
Możesz użyć opcji „usuń”, jeśli nie chcesz, aby wywołania zwrotne były wyzwalane lub chcesz poprawić wydajność. W przeciwnym razie (i przez większość czasu) będziesz chciał użyć opcji „zniszczyć”.
źródło
Wiele odpowiedzi już; chciałem wskoczyć na trochę więcej.
dokumenty :
delete
Verbage działa inaczej naActiveRecord::Association.has_many
iActiveRecord::Base
. W tym drugim przypadku delete wykonaSQL DELETE
i obejdzie wszystkie sprawdzania poprawności / wywołania zwrotne. Ten pierwszy zostanie wykonany na podstawie:dependent
opcji przekazanej do powiązania. Jednak podczas testowania znalazłem następujący efekt uboczny, w którym wywołania zwrotne były uruchamiane tylko dla,delete
a nie dladelete_all
dependent: :destroy
Przykład:źródło