別のオブジェクトが破棄された後、親オブジェクトの依存関係を更新したいという状況があります。クラス階層の例を次に示します。
class Parent < ActiveRecord::Base
has_one :info, :dependent => :destroy
has_many :conditions, :dependent => :destroy
....
end
class Info < ActiveRecord::Base
belongs_to :parent
def recalculate
# Do stuff
end
....
end
class Condition < ActiveRecord::Base
belongs_to :parent
has_one :condition_detail
after_destroy :update_info
def update_info
parent.info.recalculate
parent.info.save(:validate => false)
end
....
end
問題は、親が破棄されると、条件が破棄され、その後、after_destroyコールバックが開始され、既に破棄された後に情報オブジェクトが保存されることです。したがって、親が破棄された後も情報は存在します。検証をバイパスしないと、保存はサイレントに失敗しますが、これは望ましくありません。そして保存を使用して!例外を発生させます。
Conditionのコールバックはafter_destroyである必要があります。そうしないと、Infoのrecalculateメソッドは、必要なものを計算するための関係の状態を正しく表現できません。
親が破壊されたときにコールバックをバイパスする方法が必要なように感じますが、それは不可能だと思います。依存=>delete_allを使用することはできません。これは、Conditionの子を破棄しないためです。親がdestroyを呼び出したかどうかを判断し、その情報を使用してafter_destroyの保存をバイパスする方法があるかどうかを確認しようとしましたが、それも機能しなかったようです。
どんな助けでも大歓迎です、ありがとう!