В Postgres вы можете использовать опцию CASCADE для самого внешнего ключа.
CASCADE указывает, что при удалении ссылочной строки строки, ссылающиеся на нее, также должны автоматически удаляться. .
- https://www.postgresql.org/docs/9.5/ddl-constraints.html
Обычно это настраивается при создании таблицы, но вы можете добавить ее в существующую таблицу, удалив, а затем повторно добавив внешний ключ ограничение:
class AddCascadeToOrderItems < ActiveRecord::Migration[6.0]
def up
remove_foreign_key :order_items, :orders
add_foreign_key :order_items, :orders, on_delete: :cascade
end
def down
remove_foreign_key :order_items, :orders
add_foreign_key :order_items, :orders
end
end
Поскольку это обрабатывается на уровне БД, в вашей модели не требуется никаких настроек.
has_many :inventory_items, dependent: :delete_all
Работает также и является единственным вариантом для крестьянских баз данных, таких как MySQL но он будет запущен только при вызове .destroy
, а не .delete
в модели, которая объявляет ассоциацию как реализованную как обратный вызов модели. Например:
class Store < ApplicationRecord
has_many :inventory_items, dependent: :delete_all
end
store = Store.find(1)
store.destroy # triggers callbacks and will delete all assocatiated inventory_items
store.delete # will not trigger callbacks