Wiem, że prawdopodobnie jest to gdzieś w Internecie, ale nie mogę znaleźć odpowiedzi tutaj w Stackoverflow, więc pomyślałem, że mogę tutaj trochę zwiększyć bazę wiedzy.
Jestem nowicjuszem w Ruby and Rails, ale moja firma jest w to dość mocno zainwestowana, więc staram się to poznać bardziej szczegółowo.
Trudno mi było zmienić sposób myślenia na projektowanie aplikacji z „modelu”, a nie z bazy danych, więc próbuję dowiedzieć się, jak wykonać całą pracę projektową, którą klasycznie wykonałem w bazie danych w Zamiast tego model szynowy.
Więc ostatnim zadaniem, które sobie postawiłem, jest dowiedzieć się, jak skonfigurować model bazy danych Rails, aby wykonywać usuwanie kaskadowe? Czy jest na to łatwy sposób? A może musiałbym wejść do MySql i to ustawić?
źródło
:delete_all
a:destroy
tym. Oba spowodują, że członkostwa podrzędne (1 poziom do usuwania [potrzebne cytowanie] in
do niszczenia (jeśli ich dzieci mają niszczenia zależne)) zostaną usunięte z bazy danych, ale:destroy
utworzą instancję każdego obiektu podrzędnego i najpierw uruchomią wszelkie wywołania zwrotne, podczas gdy:delete_all
bezpośrednio uruchomią Instrukcja SQL DELETE w bazie danych.:destroy
jest z tego powodu wolniejszy, ale umożliwia wywołanie zwrotne, gdy rekord zostanie zniszczony. Omijanie Railsów na jednym końcu i potencjalna instancja n ^ x na drugim.Tak, możesz, jeśli używasz relacji takiej jak has_many, po prostu to zrób
has_many :memberships, dependent: :destroy
źródło
W przeciwieństwie do udzielonej odpowiedzi, zdecydowanie sugeruję zrobienie tego również na poziomie bazy danych. Jeśli masz różne procesy lub środowisko wielowątkowe, może się zdarzyć, że rekordy nie zostaną poprawnie usunięte. Ponadto klucz obcy bazy danych znacznie przyspiesza usuwanie dużej ilości danych.
Jak w sugerowanej odpowiedzi zrób to:
has_many :memberships, dependent: :delete_all
Pamiętaj jednak, aby skonfigurować plik
foreign_key
w migracji. W ten sposób baza danych automatycznie usuwa rekordy za Ciebie.Aby anulować wartości po usunięciu członkostwa, zakładając, że masz model użytkownika:
add_foreign_key :users, :memberships, on_delete: :nullify
Możesz również usunąć wszystkie modele po usunięciu członkostwa
add_foreign_key :users, :memberships, on_delete: :cascade
źródło
delete_all
w modelu. Klucz obcy zadba o prawidłowe usunięcie wszystkiego na poziomie bazy danych.Pamiętaj tylko, że delete_all nie wykona żadnych wywołań zwrotnych (takich jak before_destroy i after_destroy) na rekordach podrzędnych.
źródło
Wygląda na to, że ta wtyczka może dać ci to, czego szukasz, jeśli chcesz, aby usuwanie kaskadowe było odzwierciedlone w rzeczywistej strukturze bazy danych:
http://www.redhillonrails.org/foreign_key_migrations.html
Format użycia tego podczas migracji wyglądałby tak:
create_table :orders do |t| t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade ... end
źródło