Rails: dependent =>: destroy VS: dependent =>: delete all

W prowadnicach rails jest to opisane tak:

Obiekty zostaną dodatkowo zniszczone, jeśli są powiązane z :dependent => :destroy, a usunięte, jeśli są powiązane z :dependent => :delete_all

Dobra, spoko. Ale jaka jest różnica między zniszczeniem a usunięciem? Próbowałem obu i wydaje się, że robi to samo.
Author: meagar, 2010-05-09

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.

 205
Author: shingara,
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 metody destroy
  • :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 na NULL bez wywoływania ich save wywołań zwrotnych
 131
Author: John Topley,
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.

 31
Author: Manish Shrivastava,
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'.

 3
Author: atlascoder,
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