在销毁之前和相关记录销毁之前回调

时间:2012-07-25 16:08:23

标签: ruby-on-rails observers

我有以下型号:

class PhoneNumber < ActiveRecord::Base
  has_many :personal_phone_numbers, :dependent => :destroy
  has_many :people, :through => :personal_phone_numbers
end

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

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

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

简而言之,您的问题是,当Person被销毁时,您希望收集PersonalPhoneNumber的集合并对其进行操作。这种方法可能符合要求!

以下是收集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回调会传递模型,您可以对其数据进行操作。回调链完成后,它将被销毁。

<强>参考

答案 3 :(得分:0)

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

class Example < ActiveRecord::Base
before_destroy :execute_random_method


private

def execute_random_method
  ...
end
handle_asynchronously :execute_random_method