跳过回调和验证

时间:2011-06-30 15:35:42

标签: ruby-on-rails ruby-on-rails-3

有没有办法在Rails 3中按照这些方法做一些事情来跳过回调和验证?

Object.save(:validate => false, :skip_callbacks => true)

谢谢!

6 个答案:

答案 0 :(得分:15)

Object.save(:validate => false)

按预期工作。据我所知,你不能关闭回调(除非你从before_回调中返回false,但那会中止事务)。

答案 1 :(得分:3)

跳过回调有点棘手。一些插件和适配器添加了自己的"必要的"回调(acts_as_nested_set,oracle_enhanced_adapter为例)。

您可以使用skip_callbackset_callback方法检查哪些方法可以跳过。

一些自定义类方法可以提供帮助:

  def skip_all_callbacks(klass)
    [:validation, :save, :create, :commit].each do |name|
      klass.send("_#{name}_callbacks").each do |_callback|
        # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
        if (_callback.filter != :enhanced_write_lobs)
          klass.skip_callback(name, _callback.kind, _callback.filter)
        end
      end
    end
  end



  def set_all_callbacks(klass)
    [:validation, :save, :create, :commit].each do |name|
      klass.send("_#{name}_callbacks").each do |_callback|
        # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
        if (_callback.filter != :enhanced_write_lobs)
          klass.set_callback(name, _callback.kind, _callback.filter)
        end
      end
    end
  end

答案 2 :(得分:3)

之前我遇到过类似的东西,我用过这个:

Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)

答案 3 :(得分:1)

为了在Rails 3中跳过回调,你可以使用update_all来达到你的目的。

来源:update_all

跳过回调的完整列表如下:

  • 递减
  • decrement_counter
  • 删除
  • DELETE_ALL
  • 的find_by_sql
  • 增量
  • increment_counter
  • 切换
  • 触摸
  • update_column
  • update_all
  • update_counters

来源:Skipping Callbacks

答案 4 :(得分:1)

如果您尝试更新跳过所有回调和验证的记录,可以使用update_columns传递属性哈希。此方法将直接在数据库上更新列。

例如:

object.update_columns(name: 'William')

如果你想创建一个新对象,遗憾的是我认为没有方法可以跳过验证和回调。 save(:validate => false)适用于验证。对于回调,您可以使用skip_callback,但要小心,您的代码可能不是线程安全的。

答案 5 :(得分:0)

http://guides.rubyonrails.org/active_record_validations_callbacks.html详细列出了避免回调和验证的一小部分方法 - 但这些方法都不包括“保存”。

但是,验证和回调的重点是强制执行业务逻辑。如果你正在避免它们 - 你应该问问自己为什么。

另请参阅:How can I avoid running ActiveRecord callbacks?