Можно ли настроить удаление каскада в Rails? - PullRequest
76 голосов
/ 01 декабря 2008

Я знаю, что это, вероятно, где-то в Интернете, но я не могу найти ответ здесь, на Stackoverflow, поэтому я подумал, что могу немного увеличить базу знаний здесь.

Я новичок в Ruby and Rails, но моя компания в это сильно инвестирует, поэтому я пытаюсь узнать об этом чуть подробнее.

Мне было трудно изменить свое мышление на разработку приложения из «модели», а не из базы данных, поэтому я пытаюсь выяснить, как бы выполнить всю работу по дизайну, которую я классически выполнял в База данных в модели Rails вместо.

Итак, самая последняя задача, которую я сам себе дал, - выяснить, как настроить модель базы данных Rails для каскадного удаления? Есть ли простой способ сделать это? Или мне нужно зайти в MySql и настроить это?

Ответы [ 5 ]

93 голосов
/ 01 декабря 2008

Вы также можете установить: зависимый параметр в: delete_all. : delete_all выдаст одну инструкцию SQL для удаления всех дочерних записей. из-за этого использование: delete_all может повысить производительность.

has_many :memberships, dependent: :delete_all
64 голосов
/ 01 декабря 2008

Да, если вы используете отношения типа has_many, вы просто делаете это

has_many :memberships, dependent: :destroy
19 голосов
/ 29 июля 2016

Вопреки предоставленному ответу я настоятельно рекомендую сделать это на уровне базы данных. В случае, если у вас разные процессы или многопоточная среда, может случиться, что записи не будут удалены должным образом. Кроме того, внешний ключ базы данных ускоряет процесс удаления большого количества данных.

Как и в предложенном ответе сделать это:

has_many :memberships, dependent: :delete_all

Однако также убедитесь, что в миграции настроено foreign_key. Таким образом, база данных позаботится об автоматическом удалении записей для вас.

Чтобы обнулить значения при удалении членства, при условии, что у вас есть модель пользователя:

add_foreign_key :users, :memberships, on_delete: :nullify

Вы также можете удалить все модели при удалении членства

add_foreign_key :users, :memberships, on_delete: :cascade
10 голосов
/ 02 декабря 2008

Просто помните, что delete_all не будет выполнять никаких обратных вызовов (например, before_destroy и after_destroy) для дочерних записей.

6 голосов
/ 01 декабря 2008

Похоже, этот плагин может дать вам то, что вы ищете, если вы хотите, чтобы каскадные удаления отражались в реальной структуре базы данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...