保存active_record而不调用rails3中的回调

时间:2010-10-25 13:03:43

标签: ruby-on-rails activerecord ruby-on-rails-3 callback

  

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

在rails 2中,active_records上有一个名为create_without_callbacks的私有方法,您可以调用该方法将记录保存到数据库中,而不会触发与该对象关联的回调。这种方法在rails 3中已经消失了,有什么办法可以实现同样的目的吗?

4 个答案:

答案 0 :(得分:2)

当您拨打create_without_callbacks时,您正在阻止某些业务逻辑发生。如果不需要,请考虑删除回调,或者仅在需要时使用:if:unless选项触发回调。

答案 1 :(得分:0)

我不知道所有这些是否仍然适用于R3,至少在2.3.8中是这样的。

如果它只是一个属性,那么

self.update_attribute(:attribute, value)

如果它是一个对象的多个属性

self.update_attributes({:attribute => value})

您还可以使用某些条件更新所有记录

update_all( "category = 'authorized' approved = 1, author = 'David'" )

我刚从rails API中获取的最后一个,我认为它不会调用回调,但我不确定。

答案 2 :(得分:0)

查看了rails3的源代码后,似乎回调的方式是使得model.save方法实际上并不知道它们。

我选择的解决方案是模拟Model.find并返回一个尚未保存的实例。这实际上是应该如何进行单元测试,并且它们可以更快地启动。

如果你有兴趣找到一个黑客,我建议你看看

  • Rails3中/的ActiveSupport / LIB / active_support / callbacks.rb
  • Rails3中/ activemodel的/ LIB / active_model / callbacks.rb
  • 导轨/了activerecord / LIB / active_record / callbacks.rb
按顺序

答案 3 :(得分:0)

你可以使用偷偷摸摸的宝石:https://rubygems.org/gems/sneaky-save