Rails:是不是有跳过 after_save 过滤器的 save_without_validation 等效项?

Posted

技术标签:

【中文标题】Rails:是不是有跳过 after_save 过滤器的 save_without_validation 等效项?【英文标题】: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 的方法?

谢谢,

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Rails:是不是有跳过 after_save 过滤器的 save_without_validation 等效项?的主要内容,如果未能解决你的问题,请参考以下文章

在 rails 3 中弃用 after_save 解决方案

Rails after_save 错误

Rails 3:取消在 after_save 上的插入

具有虚拟属性的 after_save 回调 Rails 3

Rails after_save 回调未触发

Rails ActiveRecord 在 after_save 回调中使用最近保存的记录 ID [关闭]