【问题标题】:How to get true after_destroy in Rails?如何在 Rails 中获得真正的 after_destroy?
【发布时间】:2011-05-11 15:52:36
【问题描述】:

我有一个after_destroy 模型回调,它在模型实例被销毁后重新生成缓存。它通过为需要重新缓存的页面调用open("http://domain.com/page-to-cache") 来实现这一点。

问题在于模型实例此时显然还没有完全销毁,因为那些打开的 url 请求仍然注册它的存在,并且重新生成的缓存看起来与销毁前的缓存完全一样。在模型实例实际销毁后如何运行这些调用?

【问题讨论】:

  • 你调用的是哪个 open 方法?

标签: ruby-on-rails caching model callback openurl


【解决方案1】:

在整个事务进入数据库后,您可以使用after_commit 回调来执行某些操作。这取决于您使用的 Rails 版本(2.3.x 与 3.x.x),但本质上类似于以下内容:

# 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。我在模型中试过这个,它从来没有触发过。我会在扫地机上试一试,看看会发生什么......
  • 不,仍然没有开火。尽管清扫器是从 ActionController::Caching::Sweeper 继承的,但它被设置为观察我的模型,因此应该和你的观察者一样,对吧?欣赏这些想法...
  • 我相信 Rails 2.3.8 没有默认的 after_commit 钩子。谷歌插件/宝石扩展 ActiveRecord 以提供此功能。
  • 如果有人找不到 gem/插件,我推荐 github.com/freelancing-god/after_commit 在 Rails 1 和 2 中使用。
  • after_commit 的 repo 已更改。新网址是github.com/pat/after_commit
【解决方案2】:

您可以尝试添加 after_save 回调,例如:

after_save :my_after_save_callback

def my_after_save_callback
  do_something if destroyed?
end

【讨论】:

  • 感谢您的想法。不幸的是,这是同样的问题。
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2022-07-31
  • 2016-05-11
  • 1970-01-01
相关资源
最近更新 更多