В rails 3 я знаю, что могу принудительно удалить зависимые объекты в отношениях belongs_to и has_many, используя опцию: depend = > : delete. Однако мне было интересно,
что такое поведение по умолчанию, если я не укажу: depend = > ...
Cheers, Хайо
В rails 3 я знаю, что могу принудительно удалить зависимые объекты в отношениях belongs_to и has_many, используя опцию: depend = > : delete. Однако мне было интересно,
что такое поведение по умолчанию, если я не укажу: depend = > ...
Cheers, Хайо
Документация гласит: "Когда не задан параметр, поведение заключается в том, чтобы ничего не делать со связанными записями при уничтожении записи". Таким образом, удаление или уничтожение объекта не приведет к удалению или уничтожению объектов, которым он принадлежит или имеет многие из них.
has_many использует стратегию: nullify, которая установит для постороннего значение значение null. Для has_many: через него будет использоваться delete_all.
Для has_many команда destroy всегда вызывает метод destroy для удаляются записи, чтобы выполнялись обратные вызовы. Однако удалить будет либо удалите в соответствии со стратегией, указанной: зависимая опция, или если нет: зависимая опция дана, то она будет следуйте стратегии по умолчанию. Стратегия по умолчанию: обнулить (установить внешние ключи к nil), кроме has_many: through, где по умолчанию Стратегия delete_all (удалить объединяемые записи, не запуская их обратные вызовы).
- ActiveRecord :: Ассоциации :: ClassMethods
Не уверен, что именно делает принадлежащий_, и не смог ничего найти в документации. Я постараюсь в ближайшее время покопаться и обновить ответ.
В Rails 3 значение по умолчанию :dependent
равно :nullify
, которое устанавливает внешние ключи в nil.
Стратегия по умолчанию
:nullify
для обычногоhas_many
. Кроме того, это работает только при условии, что отражение источника -belongs_to
.
Источник: http://guides.rubyonrails.org/3_1_release_notes.html#active-record
Это все еще имеет место в Rails 4.
Однако
delete
иdelete_all
будут либо выполнять удаление в соответствии со стратегией, указанной опцией:dependent
, либо если параметр:dependent
задан, то он будет следовать стратегии по умолчанию. Стратегия по умолчанию:nullify
(установите внешние ключи наnil
), за исключениемhas_many :through
, где стратегия по умолчаниюdelete_all
(удалить записи соединения, не выполняя их обратные вызовы).
Также см. документы исходного кода: https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369