【发布时间】:2011-07-17 12:30:22
【问题描述】:
这段代码线程安全吗?
MyModel.skip_callback(:save, :before, :my_callback)
my_model_instance.update_attributes(attributes)
MyModel.set_callback(:save, :before, :my_callback)
我可以安全地使用它来避免递归地重新触发相同的回调吗?
这是一个例子
class Blog < ActiveRecord::Base
after_save :update_blog_theme, :if => :active_theme_id_changed?
# ...
private
def update_blog_theme
# Reuses a previously used BlogTheme or creates a new one
blog_theme = BlogTheme.find_by_theme_id_and_blog_id(
self.active_theme_id,
self.id)
blog_theme ||= BlogTheme.create!(
:theme_id => active_theme_id,
:blog_id => self.id )
Blog.skip_callback(:save, :after, :update_blog_theme)
self.update_attributes!(:active_blog_theme_id => blog_theme.id)
Blog.set_callback(:save, :after, :update_blog_theme)
end
end
【问题讨论】:
-
看起来很老套,为什么不能使用 before_save 或 before_create?
-
这里没有要求,我没有使用这段代码,也许我永远不会这样做,但我在互联网上找到了这个解决方案,并问自己在多线程中使用它是否安全
-
用一个真实的例子编辑了问题正文
标签: ruby-on-rails ruby-on-rails-3 activerecord callback thread-safety