Можно ли удалить каскад в Rails?

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

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

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

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

Спасибо.

Матф

Ответ 1

вы также можете установить: зависимую опцию: delete_all.: delete_all выдаст один оператор SQL, чтобы удалить все дочерние записи. из-за этого с помощью: delete_all может дать вам лучшую производительность.

has_many :memberships, dependent: :delete_all

Ответ 2

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

has_many :memberships, dependent: :destroy

Ответ 3

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

Ответ 4

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

Как в предлагаемом ответе, сделайте следующее:

has_many :memberships, dependent: :delete_all

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

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

add_foreign_key :users, :memberships, on_delete: :nullify

Вы также можете удалить все модели всякий раз, когда членство будет удалено

add_foreign_key :users, :memberships, on_delete: :cascade

Ответ 5

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

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