2012-03-20 35 views
5

Tôi có liên kết sau:Làm thế nào để biết khi nào mô hình tự động bị phá hủy bởi: phụ thuộc =>: phá hủy trong đường ray?

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 

Tôi muốn biết trong do_other_stuff nếu sự tàn phá đã được kích hoạt bởi phụ thuộc => phá hủy hoặc không phải vì một phần của nó sẽ/sẽ được thực hiện trong do_some_stuff

Tôi đã thử parent.destroyed?, parent.marked_for_destruction?, parent.frozen? nhưng không có tác dụng:/

bất kỳ ý tưởng nào?

+1

Tôi không nghĩ rằng 'parent' sẽ tồn tại khi các đối tượng phụ thuộc đang được phá hủy . Nó đã biến mất rồi. – tadman

+2

Trẻ em bị phá hủy trước khi cha mẹ bị phá hủy. Sẽ không có lá cờ có sẵn trên phụ huynh, afaik. –

+1

@tadman không chính xác. 'parent' tồn tại khi đối tượng phụ thuộc bị hủy, bởi vì các em bị hủy trước khi' parent' bị phá hủy. Lệnh này có vẻ như sau: 'before_destroy' callback được kích hoạt trên' children' trước khi chúng bị hủy, 'children' sau đó bị hủy,' call_destroy' callback được kích hoạt trên 'parent',' parent' rồi cuối cùng bị hủy. Bạn có thể di chuyển logic của những gì bạn đang cố gắng làm vào phương pháp 'do_some_stuff'? – Batkins

Trả lời

0

Có lẽ một cái gì đó như thế:

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

Đúng, có thể thực hiện thủ thuật ngay cả khi sau đó :dependent => :destroy là không cần thiết. Tôi sẽ có một chút thất vọng để làm điều đó bởi vì sau đó tôi loại làm lại một cái gì đó đường ray đề xuất ... –

+0

Tôi không nghĩ rằng đây là một giải pháp tốt, nhưng nó hoạt động. Tuy nhiên cảm ơn bạn đã đề cập đến ': depend =>: destroy' –

+1

đó là lý do tại sao tôi kết thúc bằng': depends =>: delete_all' và thực hiện công việc (ghi lại sự hủy diệt) trong 'before_destroy' của parent –

3

Bạn có thể sử dụng callbacks hiệp hội (before_remove hoặc 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

Xin chào, bắt được . Tôi đã kết thúc với ': depend =>: delete_all' và thực hiện công việc (ghi lại sự hủy diệt) trong' before_destroy' của cha mẹ. –

Các vấn đề liên quan