83

可能重复:
如何避免运行 ActiveRecord 回调?

我有这样的模型

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

是否有可能以某种方式强制模型add_points_to_user在保存时跳过调用?可能类似于ActiveRecord#deletevs ActiveRecord#destroy

4

4 回答 4

174

对于 Rails 3,ActiveSupport::Callbacks为您提供了必要的控制。我刚刚在数据集成场景中面临同样的挑战,通常需要忽略通常需要的回调。您可以整体重置回调,或使用 skip_callback 明智地禁用,如下所示:

Vote.skip_callback(:save, :after, :add_points_to_user)

..之后,您可以在 :add_points_to_user 禁止的情况下对投票实例进行操作

于 2011-03-10T12:37:43.107 回答
47

以下适用于滑轨 2、滑轨 3 和滑轨 4:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks

它提供了一个跳过回调的方法列表,解释了为什么在没有仔细考虑的情况下使用它们是危险的。根据知识共享署名-相同方式共享 3.0 许可的规定在此转载。

12 跳过回调

就像验证一样,也可以跳过回调。但是,应该谨慎使用这些方法,因为重要的业务规则和应用程序逻辑可能保存在回调中。在不了解潜在影响的情况下绕过它们可能会导致数据无效。

  • 递减
  • 递减计数器
  • 删除
  • 删除所有
  • find_by_sql
  • 增量
  • 增量计数器
  • 切换
  • 触碰
  • 更新列
  • 全部更新
  • 更新计数器
于 2011-07-05T19:02:20.213 回答
29

对于 Rails 2,但不是 Rails 3,您可以使用这些:

object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
于 2009-08-28T11:21:11.527 回答
29

这将跳过您的验证:

vote.save(:validate => false)

更多信息在这里

要跳过回调和验证,您可以使用 update_column v(3.1) 或 update_all

vote = Vote.first
vote.update_column(:subject, 'CallBacks')

Aparentlly 这仅适用于 ActiveRecord 3.1

或者:

Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')

最后,您还有 i finally 选项,这将跳过所有内容:

execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"

好的最后一个它不是那么漂亮。

于 2012-01-25T11:59:05.097 回答