Rails: dependent =>: destroy VS: dependent =>: delete all
W prowadnicach rails jest to opisane tak:
Dobra, spoko. Ale jaka jest różnica między zniszczeniem a usunięciem? Próbowałem obu i wydaje się, że robi to samo.Obiekty zostaną dodatkowo zniszczone, jeśli są powiązane z
:dependent => :destroy
, a usunięte, jeśli są powiązane z:dependent => :delete_all
4 answers
Różnica polega na wywołaniu zwrotnym.
{[1] } jest bezpośrednio w aplikacji i usuwa przez SQL:
DELETE * FROM users where compagny_id = XXXX
Z :destroy
, istnieje instancjacja wszystkich Twoich dzieci. Tak więc, jeśli nie możesz go zniszczyć lub jeśli każdy ma swój własny :dependent
, można wywołać jego wywołania zwrotne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 20:04:33
Na asocjacji modelu Rails można określić opcję :dependent
, która może przyjmować jedną z następujących trzech form:
-
:destroy/:destroy_all
powiązane obiekty są niszczone obok tego obiektu przez wywołanie ich metodydestroy
-
:delete/:delete_all
wszystkie powiązane obiekty są natychmiast niszczone bez wywoływania ich metody:destroy
-
:nullify
wszystkie powiązane klucze obce obiektów są ustawione naNULL
bez wywoływania ichsave
wywołań zwrotnych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-09 10:48:06
Zobacz destroy usuwa powiązane elementy gdzie delete_all może usunąć wiele danych z tabeli self jako DELETE * FROM table where field = 'xyz'
:możliwe opcje zależne:
Kontroluje, co dzieje się z powiązanymi obiektami, gdy ich właściciel zostanie zniszczony. Zauważ, że są one zaimplementowane jako wywołania zwrotne, a Rails wykonuje wywołania zwrotne w kolejności. W związku z tym inne podobne wywołania zwrotne mogą mieć wpływ na :dependent behavior, a :dependent
behavior może mieć wpływ na inne rozmowy zwrotne.
:destroy
powoduje zniszczenie wszystkich powiązanych obiektów.
:delete_all
powoduje usunięcie wszystkich powiązanych obiektów bezpośrednio z bazy danych (więc wywołania zwrotne nie będą wykonywane).
:nullify
powoduje ustawienie kluczy obcych na NULL. Wywołania zwrotne nie są wykonywane.
:restrict_with_exception
powoduje, że wyjątek zostanie podniesiony, jeśli istnieją jakiekolwiek powiązane rekordy.
:restrict_with_error
powoduje dodanie błędu do właściciela, jeśli są jakieś powiązane obiektów.
Jeśli jest używana z opcją :through
, Asocjacja w modelu join musi mieć wartość belongs_to, a rekordy, które zostaną usunięte, są rekordami join, a nie powiązanymi rekordami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 07:11:12
W rzeczywistości główną różnicą jest to, że żadne wywołania zwrotne nie będą wywoływane, gdy :delete_all
zostało użyte. Ale gdy używane :destroy
stosu wywołań zwrotnych (:after_destroy
, :after_commit
...) zostanie zwolniony.
W związku z tym, jeśli masz touch:
deklaracje ing w modelach, które są usuwane, lepiej użyć dependent: :delete_all
raczej 'dependent: :destroy'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 05:39:12