Ruby on rails 销毁子对象的回调保存父对象的依赖关系后,在销毁父对象时会导致问题
在这种情况下,我希望在另一个对象被销毁后更新父对象的依赖项。下面是类层次结构的一个示例:Ruby on rails 销毁子对象的回调保存父对象的依赖关系后,在销毁父对象时会导致问题,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,在这种情况下,我希望在另一个对象被销毁后更新父对象的依赖项。下面是类层次结构的一个示例: class Parent < ActiveRecord::Base has_one :info, :dependent => :destroy has_many :conditions, :dependent => :destroy .... end class Info < ActiveRecord::Base belongs_to :parent def
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
类父级:destroy
有许多:条件,:依赖=>:破坏
....
结束
类信息false)
结束
....
结束
问题是,当父对象被销毁时,它会销毁条件,然后启动after_destroy回调,并在信息对象被销毁后保存它。因此,在父对象被销毁后,信息仍然存在。如果我不绕过验证,保存将自动失败,这是我不希望看到的。使用save!引发了一个异常
条件上的回调必须是after_destroy,因为否则Info上的重新计算方法将无法正确表示关系的状态,无法计算它需要的内容
我觉得我需要一种方法在父级被破坏时绕过回调,但我认为这是不可能的。我不能使用dependent=>delete_-all,因为这不会破坏条件的子项。我试着看看是否有一种方法可以判断父级是否调用了destroy,并使用该信息绕过after_destroy中的保存,但这似乎也不起作用
任何帮助都将不胜感激,谢谢 我看到有两种选择:
回调,而是希望销毁条件的人重新计算信息。这是最干净的,因为您分离了两种不同的意图:对象销毁和计算。您可以看到,如果有一天您希望同时销毁两个条件,并且仅在两个条件都销毁后重新计算,那么这将更有帮助。您不能使用回调来执行此操作。它还与调用信息的条件.destroy
的调用方更紧密地对齐。重新计算优于调用父.info.recompute的条件
如果您确实想将此行为打包到条件中,请创建一个调用的#destroy#u and#u recommulate
函数,而不仅仅是带有某种隐藏回调的#destroy
。打电话的人更清楚的是,你将开始重新计算
:dependent=>销毁:条件关联,并在父对象的回调之前将其替换为您自己的,该回调将导致在没有回调的情况下销毁条件
在Condition中,我会创建这个方法,比如说,#destroy_而不使用_回调
,并在其中destroy
Condition的子项,然后使Condition删除
本身
:dependent=>destroy
的功能非常强大,但是对于这样的循环,我认为目前为止最清晰的方法是通过去掉一些魔法并更明确地管理对象和流程生命周期,使您所做的事情非常明确