W przewodnikach po szynach opisano to następująco:
Obiekty zostaną dodatkowo zniszczone, jeśli zostaną powiązane
:dependent => :destroy
, i usunięte, jeśli zostaną powiązane:dependent => :delete_all
Racja, spoko. Ale jaka jest różnica między zniszczeniem a usunięciem? Próbowałem obu i wydaje się, że robi to samo.
ruby-on-rails
ruby
model
associations
Siergiej
źródło
źródło
W powiązaniu modelu z Railsami możesz określić
:dependent
opcję, która może przyjąć jedną z następujących trzech form::destroy/:destroy_all
Powiązane obiekty są niszczone obok tego obiektu przez wywołanie ichdestroy
metody:delete/:delete_all
Wszystkie powiązane obiekty są niszczone natychmiast, bez wywoływania ich:destroy
metody:nullify
Klucze obce wszystkich powiązanych obiektów są ustawioneNULL
bez wywoływania ichsave
wywołań zwrotnychźródło
:restrict
. Jeśli ustawione na: ograniczenie tego obiektu nie można usunąć, jeśli ma on jakiś powiązany obiekt.:delete
ani:destroy_all
opcji przez wygląda to? : Zależny opcja oczekuje albo: zniszczyć: delete_all: unieważnić lub: Filtrowanie (: Delete):delete
a:destroy_all
opcje nie istnieją. Jednak istnieją sposoby na klasy modeli, które są wywoływanedelete
idestroy_all
tak może to być powodem nieporozumień.Zobacz zniszcz usuwa powiązane z nim elementy, w których delete_all może usunąć wiele danych z własnej tabeli jako
DELETE * FROM table where field = 'xyz'
: Zależne możliwe opcje:
Kontroluje, co dzieje się z powiązanymi obiektami, gdy ich właściciel zostanie zniszczony. Zauważ, że są one zaimplementowane jako callbacki, a Railsy wykonują je w kolejności. Dlatego inne podobne wywołania zwrotne mogą wpływać na: zachowanie zależne, a
:dependent
zachowanie może wpływać na inne wywołania zwrotne.:destroy
powoduje także zniszczenie wszystkich powiązanych obiektów.:delete_all
powoduje usunięcie wszystkich powiązanych obiektów bezpośrednio z bazy danych (dlatego wywołania zwrotne nie zostaną wykonane).:nullify
powoduje, że klucze obce są ustawione na NULL. Połączenia zwrotne nie są wykonywane.:restrict_with_exception
powoduje zgłoszenie wyjątku, jeśli istnieją powiązane rekordy.:restrict_with_error
powoduje dodanie błędu do właściciela, jeśli istnieją jakieś powiązane obiekty.W przypadku korzystania z tej
:through
opcji powiązanie w modelu łączenia musi być należące do, a usuwane rekordy to rekordy łączenia, a nie powiązane rekordy.źródło
W rzeczywistości główna różnica polega na tym, że żadne wywołania zwrotne nie będą wywoływane, gdy zostaną
:delete_all
użyte. Ale gdy zostanie użyty,:destroy
stos wywołań zwrotnych (:after_destroy
,:after_commit
...) zostanie uruchomiony .W związku z tym, jeśli
touch:
usuwane są deklaracje w modelach, lepiej użyćdependent: :delete_all
raczej „zależnego:: zniszczyć”.źródło