如何跳过Activerecord回调? [复制
-
20-09-2019 - |
题
可能的重复:
如何避免运行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"
好的,最后一个不是那么漂亮。
不隶属于 StackOverflow