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

我有这样的模型

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

是否有可能以某种方式跳过呼叫 add_points_to_user 何时保存?可能是类似的 ActiveRecord#delete vs ActiveRecord#destroy?

有帮助吗?

解决方案

对于Rails 2,但无铁路3您可以使用这些:

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

其他提示

对于铁轨3, ActiveSupport ::回调 为您提供必要的控制。在数据集成方案中,我只是面临着同样的挑战,在数据集成方案中,通常需要刷牙。您可以reset_callbacks en-masse,或使用skip_callback明智地禁用:

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

以下适用于Rails 2,Rails 3和Rails 4:

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

它提供了跳过回调的方法列表,解释了为什么不仔细考虑使用它们是危险的。在创意共享归因共享的规定下,在此处转载。

12个跳过回调

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

  • 减少
  • dectement_counter
  • 删除
  • 删除所有
  • find_by_sql
  • 增量
  • 增量_counter
  • 切换
  • 触碰
  • update_column
  • 全部更新
  • update_counters

这将跳过您的验证:

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')

最后,您最终还选择了,这将跳过一切:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top