如何跳过ActiveRecord回调?

时间:2009-08-27 18:00:05

标签: ruby-on-rails rails-activerecord

  

可能重复:
  How can I avoid running ActiveRecord callbacks?

我有这样的模特

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

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

4 个答案:

答案 0 :(得分:160)

对于Rails 3,ActiveSupport::Callbacks为您提供必要的控制。在数据集成场景中,我只是面临同样的挑战,需要将通常需要的回调放在一边。您可以重置reset_callbacks,或者使用skip_callback来明智地禁用,如下所示:

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

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

答案 1 :(得分:44)

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

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

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

  

12跳过回调

     

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

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

答案 2 :(得分:29)

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

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

答案 3 :(得分:28)

这将跳过您的验证:

vote.save(:validate => false)

更多信息here

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

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

可能只适用于ActiveRecord 3.1

或者:

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

最后你还有我最后的选择,这将跳过everthing:

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

确定最后一个不太好看。