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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top