如何在Rails中获得真正的after_destroy?
我有模型实例已被破坏后重新生成缓存的after_destroy
模型回调。它通过调用open("http://domain.com/page-to-cache")
来完成此操作,以获取需要重新缓存的页面数量。如何在Rails中获得真正的after_destroy?
的问题是,该模型的实例显然还没有完全在这个时候被破坏,因为这些打开URL请求仍然注册其存在,以及再生缓存长相酷似前销毁缓存。如何在模型实例被实际销毁后运行这些调用?
您可以使用一个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将提供的功能。
谢谢,迈克。我正在使用2.3.8。我在模型中试过这个,它从来没有开过。我会尝试在清扫,并看看会发生什么...... – glortho 2011-05-11 19:03:35
没有,依旧没有开枪。即使清扫者是从ActionController :: Caching :: Sweeper继承的,它被设置为观察我的模型,因此应该和你的观察者一样,对吧?欣赏的想法... – glortho 2011-05-11 19:10:13
我相信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
感谢您的想法。不幸的是,这是同一个问题。 – glortho 2011-05-11 19:18:08
你打哪个open方法? – richardsun 2012-08-27 20:20:54