销毁前和相关记录销毁前的回调

我有以下型号:

class PhoneNumber  :destroy has_many :people, :through => :personal_phone_numbers end 

我想设置一个观察者来在delayed_job队列中运行一个动作,该队列大部分都有效,但有一个例外。 我希望before_destroy观察者在被销毁之前抓住与电话号码相关联的人,并且那些人认为延迟的工作确实有效。

问题是,当电话号码被破坏时,它会先破坏:personal_phone_numbers记录, 然后在尝试销毁电话号码时触发观察者。 那时,为时已晚。

有没有办法删除依赖记录之前观察破坏行为?

虽然这不理想,但您可以从personal_phone_numbers关系中删除:dependent => :destroy ,并在对它们进行操作后在观察者中手动删除它们。

但是,我认为这个问题可能会向您展示代码味道。 你为什么要在观察者的电话号码上操作人。 听起来这种逻辑在连接模型中处理得更好。

使用alias_method来拦截destroy调用?

 class PhoneNumber < ActiveRecord::Base has_many :personal_phone_numbers, :dependent => :destroy has_many :people, :through => :personal_phone_numbers alias_method :old_destroy, :destroy def destroy(*args) *do your stuff here* old_destroy(*args) end end 

听起来你的问题简直就是当你销毁PersonalPhoneNumber时,你想收集并处理一个Person的集合。 这种方法可能符合要求!

以下是收集Person模型的自定义回调示例。 这是一个实例方法,因此我们不必在ActiveRecord模型中实例化PersonalPhoneNumberCallbacks对象。

 class PersonalPhoneNumberCallbacks def self.after_destroy(personal_phone_number) # Something like people = Person.find_by_personal_phone_number(personal_phone_number) # Delayed Job Stuff on people end end 

接下来,添加回调做你的ActiveRecord模型:

 class PersonalPhoneNumber < ActiveRecord::Base after_destroy PictureFileCallbacks end 

您的after_destroy回调将传递模型,您可以对其数据进行操作。 回调链完成后,它将被销毁。

参考

您可以在模型中使用before_destroy回调,然后在销毁父级之前获取数据并执行您需要的任何操作。 像这个例子的东西应该是你想要的:

 class Example < ActiveRecord::Base before_destroy :execute_random_method private def execute_random_method ... end handle_asynchronously :execute_random_method