我有以下型号:
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
记录,然后会在尝试销毁电话号码时触发观察者。那时,已经太晚了。
在依赖记录被删除之前,有没有办法观察破坏行为?
答案 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