2012-03-20 11 views
5

Mam następujący związek:Jak sprawdzić, czy model jest destijowany automatycznie przez: 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 

chciałbym wiedzieć do_other_stuff jeśli zniszczenie został zwolniony przez dependent => zniszczyć lub nie, ponieważ część z nich będzie/będą wykonywane w do_some_stuff

Próbowałem: parent.destroyed?, , parent.frozen?, ale nic nie działa:/

jakieś pomysły?

+1

Nie sądzę 'parent' będzie istnieć, gdy zależne obiekty są niszczone . To już minęło. – tadman

+2

Dzieci są niszczone, zanim rodzic zostanie zniszczony. Nie będzie żadnej flagi na rodzicu, Afaiku. –

+1

@adadman jest niepoprawny. 'rodzic' istnieje, gdy obiekt zależny jest niszczony, ponieważ dzieci zostają zniszczone przed zniszczeniem' rodzica'. Wydaje się, że kolejność jest następująca: callback 'before_destroy' jest uruchamiany na' children' zanim zostanie zniszczony, 'children' następnie zostanie zniszczony, callback' before_destroy' zostanie uruchomiony na 'parent',' parent' następnie na końcu zostanie zniszczony. Czy możesz przenieść logikę tego, co próbujesz zrobić, do metody 'do_some_stuff'? – Batkins

Odpowiedz

0

Może coś takiego:

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

Tak, to może wystarczyć, nawet jeśli wtedy :dependent => :destroy nie jest konieczne. Byłbym trochę sfrustrowany, ponieważ wtedy coś w stylu przerobić na coś, co proponuje szyny ... –

+0

Nie sądzę, że to dobre rozwiązanie, ale działa. Jednak dziękuję za wzmiankę o ': dependent =>: destroy' –

+1

dlatego właśnie skończyłem z': dependent =>: delete_all' i wykonałem zadanie (logując zniszczenie) w 'before_destroy' of parent –

3

Można użyć wywołania zwrotne Association (before_remove lub 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

Witam, niezły chwyt . W efekcie otrzymałem ': dependent =>: delete_all' i wykonuję zadanie (rejestrowanie destrukcji) w' before_destroy' of parent. –

Powiązane problemy