Я знаю, что это, вероятно, где-то в Интернете, но я не могу найти ответ здесь, в Stackoverflow, поэтому я подумал, что могу немного расширить базу знаний здесь.
Я новичок в Ruby и Rails, но моя компания очень сильно в них вкладывается, поэтому я пытаюсь познакомиться с ней немного подробнее.
Мне было трудно изменить свое мышление, чтобы разрабатывать приложение на основе «модели», а не на основе базы данных, поэтому я пытаюсь понять, как бы я мог выполнять всю работу по проектированию, которую я обычно выполнял в базе данных Вместо этого модель Rails.
Итак, последняя задача, которую я дал себе, - это выяснить, как настроить модель базы данных Rails для выполнения каскадных удалений? Есть ли простой способ сделать это? Или мне нужно будет войти в MySql и настроить это?
источник
:delete_all
и:destroy
для этого. Оба будут вызывать дочернее членство (1 уровень для удаления [необходима цитата] иn
для уничтожения (если их дочерние элементы имеют зависимые уничтожения)) будут удалены из базы данных, но:destroy
будут создавать экземпляры каждого дочернего объекта и сначала запускать любые обратные вызовы, тогда как:delete_all
будет напрямую запускать Оператор SQL DELETE в базе данных.:destroy
из-за этого работает медленнее, но позволяет выполнять обратные вызовы при уничтожении записи. Обход Rails на одном конце и потенциальное создание n ^ x на другом.Да, можно, если вы используете отношения типа has_many, просто сделайте это
has_many :memberships, dependent: :destroy
источник
В отличие от предоставленного ответа, я настоятельно рекомендую также сделать это на уровне базы данных. Если у вас разные процессы или многопоточная среда, может случиться так, что записи не будут удалены должным образом. Кроме того, внешний ключ базы данных ускоряет процесс удаления большого количества данных.
Как и в предложенном ответе, сделайте это:
has_many :memberships, dependent: :delete_all
Однако также не забудьте настроить файл
foreign_key
в миграции. Таким образом, база данных позаботится об автоматическом удалении записей за вас.Чтобы обнулить значения при удалении членства, если у вас есть модель пользователя:
add_foreign_key :users, :memberships, on_delete: :nullify
Вы также можете удалить все модели при удалении членства
add_foreign_key :users, :memberships, on_delete: :cascade
источник
delete_all
в модели. Внешний ключ позаботится о правильном удалении всего на уровне базы данных.Просто имейте в виду, что delete_all не будет выполнять никаких обратных вызовов (например, before_destroy и after_destroy) для дочерних записей.
источник
Похоже, этот плагин может дать вам то, что вы ищете, если вы хотите, чтобы каскадные удаления отражались в фактической структуре базы данных:
http://www.redhillonrails.org/foreign_key_migrations.html
Формат для использования этого при миграции будет примерно таким:
create_table :orders do |t| t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade ... end
источник