如何在Rails中获得真正的after_destroy?

问题描述:

我有模型实例已被破坏后重新生成缓存的after_destroy模型回调。它通过调用open("http://domain.com/page-to-cache")来完成此操作,以获取需要重新缓存的页面数量。如何在Rails中获得真正的after_destroy?

的问题是,该模型的实例显然还没有完全在这个时候被破坏,因为这些打开URL请求仍然注册其存在,以及再生缓存长相酷似前销毁缓存。如何在模型实例被实际销毁后运行这些调用?

+0

你打哪个open方法? – richardsun 2012-08-27 20:20:54

您可以使用一个after_commit回调,整个交易已通过对数据库离开之后做一些事情。这是不同取决于你使用(2.3.x版本与3.xx的)的Rails的版本,但基本上是类似以下内容:

# model_observer.rb 
class ModelObserver < ActiveRecord::Observer 
    def after_commit(instance) 
    do_something if instance.destroyed? 
    end 
end 

你可以阅读一些文件有关的Rails 3 after_commit回调here 。如果你的Rails的版本不具有after_commit钩,你可以尝试使用this gem将提供的功能。

+0

谢谢,迈克。我正在使用2.3.8。我在模型中试过这个,它从来没有开过。我会尝试在清扫,并看看会发生什么...... – glortho 2011-05-11 19:03:35

+0

没有,依旧没有开枪。即使清扫者是从ActionController :: Caching :: Sweeper继承的,它被设置为观察我的模型,因此应该和你的观察者一样,对吧?欣赏的想法... – glortho 2011-05-11 19:10:13

+1

我相信Rails的2.3.8没有默认'after_commit'挂钩。 Google提供了一个扩展ActiveRecord以提供此功能的插件/ gem。 – 2011-05-12 13:42:27

你可以尝试添加after_save的回调,如:

after_save :my_after_save_callback 

def my_after_save_callback 
    do_something if destroyed? 
end 
+0

感谢您的想法。不幸的是,这是同一个问题。 – glortho 2011-05-11 19:18:08