2015-07-10 26 views
9

Ho un oggetto che A has_many B 's (semplice associazione):Ruby on Rails - Associazione viene cancellato prima "before_destroy"

has_many :book_accounts, { 
    dependent: :destroy 
} 

stavo lavorando su un before_destroy callback. Voglio verificare che non ci siano C (che appartiene al numero B) e D (che appartiene a C) prima di distruggere lo A. Ho controllato il registro e tutti gli B vengono eliminati prima della richiamata che causa l'arresto anomalo del callback.

È così che dovrebbe funzionare Rails? C'è qualcosa che posso fare se non rimuovere lo dependent: destroy e distruggere manualmente lo B in un callback after_destroy? O è la soluzione ideale?

+0

Vedi la discussione qui: https://github.com/rails/rails/issues/3458 –

risposta

16

Questo è un problema molto stupido di rotaie & frustrante anche. Quando si definisce una relazione in Rails, l'opzione :dependent crea effettivamente una richiamata. Se si definisce una callback before_destroy dopo la relazione, la chiamata non viene chiamata fino a quando le relazioni non vengono distrutte.

La soluzione è ordinare la vostra chiamata before_destroy prima della dichiarazione dell'associazione.

Il codice sarà qualcosa di simile

Class A < ActiveRecord::Base 
    before_destroy :check 

    has_many :book_accounts, dependent: :destroy 
End 
+0

In realtà ho appena scoperto anche questo (https://github.com/rails/rails/issues/3458) e stavo rispondendo alla domanda quando hai risposto. Grazie! – Isaac

4

devono aggiungere prepend: true di callback dichiarazione:

before_destroy :do_something_before_children_removed, prepend: true