このコードはスレッドセーフですか?Rails 3 ActiveRecord .skip_callbackスレッドの安全性
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を使用できませんか? – apneadiving
最終要件は何ですか? – Anatoly
ここには要件はありません。私はこのコードを使用していません。おそらく私は決してしませんが、インターネット上でこのソリューションを見つけ、マルチスレッドで使用するのが安全かどうか自分に尋ねました。 – mcasimir