Rails - 我应该在 skip_callbacks 之后 set_callbacks 吗?
Rails - shall I set_callbacks after skip_callbacks?
在迁移中,我禁用了如下回调:
class AlignUserAreaToCountry < ActiveRecord::Migration
def up
# disable the after_initialize :_set_defaults callback
User.skip_callback(:initialize, :after, :_set_defaults)
...
end
end
我可以在同一个 up
方法的末尾调用 User.set_callback(...)
吗?
我记得上次,您确实需要使用 set_callback
重新启用回调。值得庆幸的是,您可以将一个块传递给 skip_callback
和 运行 您的迁移,这样您就不需要明确地做:
User.skip_callback(:initialize, :after, :_set_defaults) do
add_column :users, :first_name, :string
end
更多信息见 ActiveSupport::Callbacks::ClassMethods、http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html
但是,此解决方案不是线程安全的。我建议使用虚拟属性(例如 dont_apply_callbacks),如果它存在,则跳过所需的回调。
在迁移中,我禁用了如下回调:
class AlignUserAreaToCountry < ActiveRecord::Migration
def up
# disable the after_initialize :_set_defaults callback
User.skip_callback(:initialize, :after, :_set_defaults)
...
end
end
我可以在同一个 up
方法的末尾调用 User.set_callback(...)
吗?
我记得上次,您确实需要使用 set_callback
重新启用回调。值得庆幸的是,您可以将一个块传递给 skip_callback
和 运行 您的迁移,这样您就不需要明确地做:
User.skip_callback(:initialize, :after, :_set_defaults) do
add_column :users, :first_name, :string
end
更多信息见 ActiveSupport::Callbacks::ClassMethods、http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html
但是,此解决方案不是线程安全的。我建议使用虚拟属性(例如 dont_apply_callbacks),如果它存在,则跳过所需的回调。