2015-07-10 7 views
9

Ich habe ein Objekt A dass B ‚s (einfache Zuordnung) has_many:Ruby on Rails - Verein wird vor "before_destroy" gelöscht

has_many :book_accounts, { 
    dependent: :destroy 
} 

ich auf einem before_destroy Rückruf arbeitete. Ich möchte überprüfen und sicherstellen, dass es keine C 's gibt (die B gehört) und ' s (die C gehört) vor der Zerstörung der A. Ich überprüfte das Protokoll und alle B werden vor dem Rückruf gelöscht, wodurch der Rückruf zum Absturz gebracht wird.

Soll das wie Rails funktioniert? Kann ich etwas anderes tun, als die dependent: destroy zu entfernen und die B in einem after_destroy Rückruf manuell zu zerstören? Oder ist das die Go-to-Lösung?

+0

die Diskussion Siehe hier: https://github.com/rails/rails/issues/3458 –

Antwort

16

Dies ist ein sehr albernes Problem der Schienen & frustrierend zu. Wenn Sie eine Beziehung in Rails definieren, erstellt die Option :dependent tatsächlich einen Rückruf. Wenn Sie nach der Beziehung einen Rückruf before_destroy definieren, wird Ihr Rückruf nicht aufgerufen, bis die Beziehungen zerstört sind.

Die Lösung ist, Ihre before_destroy Rückruf vor der Deklaration der Zuordnung zu bestellen.

Ihr Code wird so etwas wie diese

Class A < ActiveRecord::Base 
    before_destroy :check 

    has_many :book_accounts, dependent: :destroy 
End 
+0

Ich habe das gerade herausgefunden (https://github.com/rails/rails/issues/3458) und war gerade dabei, die Frage zu beantworten, als du geantwortet hast. Vielen Dank! – Isaac

4

Haben hinzufügen prepend: true seine Erklärung Rückruf:

before_destroy :do_something_before_children_removed, prepend: true