如何跳过ActiveRecordcallback?

可能重复:
我怎样才能避免运行ActiveRecordcallback?

我有这样的模型

class Vote < ActiveRecord::Base after_save :add_points_to_user ..... end 

有没有可能强制模型跳过保存时调用add_points_to_user ? 可能像ActiveRecord#deleteActiveRecord#destroy

对于Rails 2,而不是Rails 3,你可以使用这些:

 object.send(:create_without_callbacks) object.send(:update_without_callbacks) 

对于Rails 3, ActiveSupport :: Callbacks给你必要的控制。 在数据集成的情况下,我正面临着同样的挑战,那就是需要将通常需要的callback放在一边。 您可以reset_callbacks en-masse,或使用skip_callback明智地禁用,如下所示:

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

之后,您可以使用以下操作对投票实例进行操作:add_points_to_user被禁止

以下适用于导轨2,导轨3和导轨4:

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

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

12跳过callback

就像validation一样,也可以跳过callback。 但是,这些方法应谨慎使用,因为重要的业务规则和应用程序逻辑可能保留在callback中。 绕过它们而不理解潜在的含义可能会导致无效的数据。

  • 减量
  • decrement_counter
  • 删除
  • 删除所有
  • 的find_by_sql
  • 增量
  • increment_counter
  • 切换
  • 触摸
  • update_column
  • 全部更新
  • update_counters

这将跳过您的validation:

 vote.save(:validate => false) 

更多信息在这里

要跳过callback和validation,您可以使用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') 

最后你也是我最后的select,这将跳过everthing:

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

好吧,最后一个不是很漂亮。