2012-03-20 8 views
5

Ho la seguente associazione:Come sapere quando il modello viene disattivato automaticamente da a: dependent =>: destroy in rail?

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 

Vorrei sapere in do_other_stuff se la distruzione è stato sparato da dipendente => distruggere o non perché parte di essa sarebbe/sarà fatto in do_some_stuff

Ho provato parent.destroyed?, parent.marked_for_destruction?, parent.frozen? ma niente funziona:/

qualche idea?

+1

Non credo 'parent' esisterà quando gli oggetti dipendenti sono stati distrutti . È già andato. – tadman

+2

I bambini vengono distrutti prima che il genitore venga distrutto. Non ci sarà nessuna bandiera disponibile sul genitore, afaik. –

+1

@tadman non è corretto. 'parent' esiste quando l'oggetto dipendente viene distrutto, perché i bambini vengono distrutti prima che il' parent' venga distrutto. L'ordine sembra essere il seguente: callback 'before_destroy' viene attivato su' children' prima che vengano distrutti, 'children' e poi distrutti,' before_destroy' viene richiamato su 'parent',' parent' e infine viene distrutto. Puoi spostare la logica di ciò che stai cercando di fare nel metodo 'do_some_stuff'? – Batkins

risposta

0

Forse qualcosa di simile:

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ì, questo potrebbe fare il trucco anche se poi lo :dependent => :destroy non è necessario. Sarei un po 'frustrato a farlo perché poi ripeto qualcosa che le rotaie propongono ... –

+0

Non penso che questa sia una buona soluzione, ma funziona. Comunque grazie per aver menzionato ': dependent =>: destroy' –

+1

ecco perché ho finito con': dependent =>: delete_all' e ho fatto il lavoro (logging the destruction) nel 'before_destroy' del genitore –

3

È possibile utilizzare i callback di associazione (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

Ciao, bella cattura . Ho finito con ': dependent =>: delete_all' e ho fatto il lavoro (registrando la distruzione) nel' before_destroy' di parent. –