【问题标题】:Rails: Is there an equivalent to save_without_validation which skips after_save filters?Rails:是否有跳过 after_save 过滤器的 save_without_validation 等效项?
【发布时间】:2008-11-24 22:25:55
【问题描述】:

我有一个 after_save 过滤器,我不想在特定实例中触发它。有没有类似于 save_without_validation 的方法?

谢谢,

【问题讨论】:

    标签: ruby-on-rails after-save


    【解决方案1】:

    使用 rails 2 时,您可以通过以下方式调用私有方法 create_without_callbacks

    @my_obj.send(:create_without_callbacks)
    

    【讨论】:

      【解决方案2】:

      这里有一个扩展 ActiveRecord 以提供回调跳过的好例子:http://weareintegrum.com/?p=10

      这个想法是在 ActiveRecord 上创建一个名为 skip_callback 的方法,它接受一个块:

      def self.skip_callback(callback, &block)
        method = instance_method(callback)
        remove_method(callback) if respond_to?(callback)
        define_method(callback){ true }
        begin
          result = yield
        ensure
          remove_method(callback)
          define_method(callback, method)
        end
        result
      end
      

      那么你在块中所做的任何事情都不会执行回调。

      【讨论】:

        【解决方案3】:

        您可以像这样设置和重置回调:

          Post.after_update.reject! {|callback| callback.method.to_s == 'fancy_callback_on_update' }
          Post.after_create.reject! {|callback| callback.method.to_s == 'fancy_callback_on_create' }
        
          Post.after_create :fancy_callback_on_create
          Post.after_update :fancy_callback_on_update
        

        您可以在您的自定义 save 方法周围添加这些。

        【讨论】:

          【解决方案4】:

          对于 Rails 2,您还可以使用以下方法:

          create_without_callbacksupdate_without_callbacks

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-15
            • 2014-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-08
            相关资源
            最近更新 更多