Каковы значения по умолчанию для Rails 3 для: зависит от has_many и принадлежит_to

В rails 3 я знаю, что могу принудительно удалить зависимые объекты в отношениях belongs_to и has_many, используя опцию: depend = > : delete. Однако мне было интересно,

что такое поведение по умолчанию, если я не укажу: depend = > ...

Cheers, Хайо

Ответ 1

Документация гласит: "Когда не задан параметр, поведение заключается в том, чтобы ничего не делать со связанными записями при уничтожении записи". Таким образом, удаление или уничтожение объекта не приведет к удалению или уничтожению объектов, которым он принадлежит или имеет многие из них.

Ответ 2

has_many использует стратегию: nullify, которая установит для постороннего значение значение null. Для has_many: через него будет использоваться delete_all.

Для has_many команда destroy всегда вызывает метод destroy для удаляются записи, чтобы выполнялись обратные вызовы. Однако удалить будет либо удалите в соответствии со стратегией, указанной: зависимая опция, или если нет: зависимая опция дана, то она будет следуйте стратегии по умолчанию. Стратегия по умолчанию: обнулить (установить внешние ключи к nil), кроме has_many: through, где по умолчанию Стратегия delete_all (удалить объединяемые записи, не запуская их обратные вызовы).

- ActiveRecord :: Ассоциации :: ClassMethods

Не уверен, что именно делает принадлежащий_, и не смог ничего найти в документации. Я постараюсь в ближайшее время покопаться и обновить ответ.

Ответ 3

В 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 (удалить записи соединения, не выполняя их обратные вызовы).

Источник: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

Также см. документы исходного кода: https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369