10

En los raíles 3, sé que puedo forzar la eliminación de objetos dependientes en belongs_to y has_ ​​many relaciones usando la opción: dependent =>: delete. Sin embargo me preguntaba,¿Cuáles son los valores predeterminados para Rails 3 para: dependiente de has_many y belongs_to

lo que es el comportamiento por defecto si no especifico: dependiente => ...

Cheers, Hajo

+1

si no se especifica esto, usted va a terminar con los niños abandonados llorando por sus padres.Eso no es gran cosa, pero mantiene su base de datos llena de datos (inútiles) – apneadiving

Respuesta

16

Aunque no se especifica en el documentation, la el comportamiento predeterminado es no hacer nada con los objetos asociados. Es decir, eliminar o destruir un objeto no eliminará ni destruirá los objetos a los que pertenece o tiene muchos.

+0

Gracias por señalar eso :) Esperaría que los raíles intenten usar consultas DB para cargar objetos dependientes, si sus campos ID no se anulan correctamente. Esto significa, desperdiciando tiempo de CPU y DB para buscar registros no existentes. Así que me pregunto por qué los rieles no están haciendo nada al respecto por defecto ... – fxtentacle

6

has_many usa la estrategia: nullify, que establecerá el foráneo en nulo. Para has_many: a través de él usará delete_all.

Para has_many, destroy siempre llamará al método destroy del registro que se está eliminando para que se ejecuten las devoluciones de llamada. Sin embargo, eliminar hacer la eliminación de acuerdo con la estrategia especificada por la : opción dependiente, o si no se da la opción dependiente, entonces seguirá la estrategia predeterminada. La estrategia predeterminada es: anular (establecer las claves externas en nil), excepto para has_many: through, donde la estrategia predeterminada es delete_all (eliminar los registros de combinación, sin ejecutar sus callbacks ).

- ActiveRecord::Associations::ClassMethods

No estoy seguro exactamente lo belongs_to hace, y no era capaz de encontrar nada en la documentación. Trataré de cavar un poco pronto y actualizaré la respuesta.

+6

¿Estás seguro de que este sigue siendo el caso? Acabo de experimentar que el comportamiento predeterminado NO es anular las claves foráneas. Tuve que establecer 'dependent:: nullify' explícitamente para que se anulara. Estoy usando ruby ​​2.0.0 y Rails 4.0.0. – Magne

3

En Rails 3, el valor predeterminado :dependent es :nullify que establece las claves externas en nil.

La estrategia predeterminada es :nullify para regular de has_many. Además, esto solo funciona si la reflexión fuente es belongs_to.

Fuente: http://guides.rubyonrails.org/3_1_release_notes.html#active-record

Este es todavía el caso en los carriles 4.

Sin embargo delete y delete_all, o bien hacer la eliminación de acuerdo con la estrategia especificado por la opción :dependent, o si no hay :dependent opción, luego seguirá la estrategia predeterminada. La estrategia predeterminada es :nullify (establezca las claves externas en nil), excepto en has_many :through, donde la estrategia predeterminada es delete_all (elimine los registros de combinación, sin ejecutar sus devoluciones).

Fuente: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

ver también la documentación de código fuente: https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369

+0

Desafortunadamente esto no es correcto. Los documentos citados se refieren a llamar a delete/delete_all en una asociación has_many (como 'blog.posts.delete_all'). Llamar 'blog.destroy' en un modelo - no en una relación - no hará nada en absoluto a los modelos asociados a menos que la relación' has_many' especifique un comportamiento 'dependiente'. (El valor predeterminado es dejar referencias colgantes) – gmcnaughton

Cuestiones relacionadas