2012-03-20 9 views
5

tengo la siguiente asociación:Cómo saber cuándo el modelo es destruido automáticamente por a: dependent =>: destroy in rails?

class Parent < ActiveRecord::Base 
    has_many :children, :dependent => :destroy 
    before_destroy :do_some_stuff 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
    before_destroy :do_other_stuff 
end 

me gustaría saber en do_other_stuff si la destrucción ha sido disparada por dependiente => destruir o no por parte del que sería/se hará en do_some_stuff

Intenté parent.destroyed?, parent.marked_for_destruction?, parent.frozen? pero nada funciona:/

¿Alguna idea?

+1

No creo que 'existirá parent' cuando los objetos dependientes están siendo destruidos . Ya se fue. – tadman

+2

Los niños son destruidos antes de que el padre sea destruido. No habrá ninguna bandera disponible en el padre, afaik. –

+1

@tadman es incorrecto. 'parent' existe cuando el objeto dependiente se destruye, porque los niños se destruyen antes de que el' parent' se destruya. El orden parece ser el siguiente: la devolución de llamada 'before_destroy' se activa en' children' antes de que se destruyan, 'children' se destruye,' response_destroy' se activa en 'parent',' parent' y finalmente se destruye. ¿Puedes mover la lógica de lo que estás tratando de hacer al método 'do_some_stuff'? – Batkins

Respuesta

0

Tal vez algo así:

class Parent < ActiveRecord::Base 
    has_many :children 
    before_destroy :some_stuff 
    def some_stuff 
     children.each do |child| 
      child.parent_say_bye 
     end 
    end 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
    before_destroy :do_other_stuff 
    def parent_say_bye 
     #do some stuff 
     delete 
    end 
end 
+0

Sí, eso podría hacer el truco incluso si entonces el :dependent => :destroy no es necesario. Me frustraría un poco hacer eso porque luego rehago algo que propone rails ... –

+0

No creo que esta sea una buena solución, pero funciona. Sin embargo, gracias por mencionar ': dependent =>: destroy' –

+1

es por eso que terminé con': dependent =>: delete_all' y hago el trabajo (registrando la destrucción) en el 'before_destroy' del padre –

3

Puede utilizar las devoluciones de llamada de asociación (before_remove o after_remove)

class Parent < ActiveRecord::Base 
    has_many :children, :dependent => :destroy, :before_remove => :do_foo 

    before_destroy :do_bar 

    def do_bar 
    end 

    def do_foo 
    end 
end 
+0

Hola, buena captura . Terminé con ': dependent =>: delete_all' y hago el trabajo (registrando la destrucción) en el' before_destroy' del padre. –

Cuestiones relacionadas