В направляющих рельсов это описано так:
Объекты будут дополнительно уничтожены, если они связаны с
:dependent => :destroy
, и удалены, если они связаны с:dependent => :delete_all
Хорошо, круто Но какая разница между уничтожением и удалением? Я попробовал и то, и другое, похоже, делает то же самое.
ruby-on-rails
ruby
model
associations
Сергей
источник
источник
В ассоциации моделей Rails вы можете указать
:dependent
опцию, которая может принимать одну из следующих трех форм::destroy/:destroy_all
Связанные объекты уничтожаются вместе с этим объектом, вызывая ихdestroy
метод:delete/:delete_all
Все связанные объекты уничтожаются немедленно, без вызова их:destroy
метода.:nullify
Внешние ключи всех связанных объектов установленыNULL
без вызова ихsave
обратных вызововисточник
:restrict
. Если установлено значение: restrict, этот объект не может быть удален, если у него есть какой-либо связанный объект.:delete
или:destroy_all
вариантов по внешнему виду? Опция: зависимый ожидает: destroy,: delete_all,: nullify или: restrict (: delete):delete
и:destroy_all
вариантов не существует. Однако в вызываемых моделях есть методы класса,delete
иdestroy_all
это может стать причиной путаницы.Увидеть уничтожает удаляет связанные с ним элементы, где delete_all может удалить несколько данных из собственной таблицы как
DELETE * FROM table where field = 'xyz'
: Зависимые возможные варианты:
Управляет тем, что происходит со связанными объектами, когда их владелец уничтожен. Обратите внимание, что они реализованы как обратные вызовы, а Rails выполняет обратные вызовы по порядку. Следовательно, другие подобные обратные вызовы могут влиять на зависимое поведение, а
:dependent
поведение может влиять на другие обратные вызовы.:destroy
вызывает уничтожение всех связанных объектов.:delete_all
вызывает удаление всех связанных объектов непосредственно из базы данных (поэтому обратные вызовы не будут выполняться).:nullify
заставляет внешние ключи быть установленными в NULL. Обратные вызовы не выполняются.:restrict_with_exception
вызывает исключение, если есть какие-либо связанные записи.:restrict_with_error
вызывает добавление ошибки к владельцу, если есть какие-либо связанные объекты.При использовании с этой
:through
опцией, ассоциация в модели соединения должна быть принадлежащей для принадлежности, а удаляемые записи являются записями соединения, а не связанными записями.источник
На самом деле главное отличие состоит в том, что никакие обратные вызовы не будут вызываться при
:delete_all
использовании. Но когда используется:destroy
стек обратных вызовов (:after_destroy
,:after_commit
...) будет запущен.Следовательно, если у вас есть
touch:
объявления в моделях, которые вы удаляете, то лучше использоватьdependent: :delete_all
скорее «зависимый:: уничтожить».источник