Los rieles evitan la eliminación del niño a menos que el padre también se elimine
-
26-12-2019 - |
Pregunta
en Ruby on Rails 4, digamos que un padre tiene muchos hijos.Cuando se elimina el padre, los hijos también deben eliminarse.Aparte de eso, el niño no será eliminado a menos que sea huérfano.¿Como hacer eso?
Probé con lo siguiente
class Parent < ActiveRecord::Base
has_many :children, inverse_of: :parent, dependent: :destroy
end
class Child < ActiveRecord::Base
belongs_to :parent, inverse_of: :children
before_destroy :checks
private
def checks
not parent # true if orphan
end
end
Sin embargo, con la comprobación before_destroy no se elimina nada.¿Hay alguna forma de saber si el motivo de la llamada es la eliminación del padre?
¿Es extraño pedir esto?Quiero decir, prevenir la eliminación de niños.
Solución
Trabajando a partir de la respuesta de la carpa de Rieles:cómo deshabilitar la devolución de llamada before_destroy cuando se está destruyendo debido a que se está destruyendo el padre (:dependiente =>: destruir), prueba esto:
Niño:
belongs_to :parent
before_destroy :prevent_destroy
attr_accessor :destroyed_by_parent
...
private
def prevent_destroy
if !destroyed_by_parent
self.errors[:base] << "You may not delete this child."
return false
end
end
Padre:
has_many :children, :dependent => :destroy
before_destroy :set_destroyed_by_parent, prepend: true
...
private
def set_destroyed_by_parent
children.each{ |child| child.destroyed_by_parent = true }
end
Tuvimos que hacer esto porque estamos usando Paranoia y dependent: delete_all
los eliminaría de forma definitiva en lugar de eliminarlos temporalmente.Mi instinto me dice que hay una mejor manera de hacer esto, pero no es obvia, y esto hace el trabajo.