【问题标题】:Save active_record without calling callbacks in rails3 [duplicate]保存active_record而不在rails3中调用回调[重复]
【发布时间】:2010-10-25 13:03:43
【问题描述】:

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

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

【问题讨论】:

  • 这个问题明确指出了 Rails 3。假定的副本是在 Rails 2 天内写回的,现在包含 rails 4 信息,但没有具体解决在 Rails 3 中创建记录的问题(尽管它确实包含关于更新 Rails 3) 中的现有记录。在我看来,这个问题是独立且独特的,而不是重复的。

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


【解决方案1】:

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

【讨论】:

  • 当我对一个依赖于另一个对象的对象进行单元测试时,我经常想模拟出依赖关系。不幸的是,如果我这样做,active_record 会抱怨模拟不是正确的类型。在 rails 2 中,我通过使用 factory girl 来创建有效类型正确的存根来解决这个问题。我添加了一个工厂女孩策略,该策略使用 create_without_callbacks 方法插入一条记录,因为它们无关紧要。
  • 我明白,但这样你就不会再测试“现实生活”对象了。所以,本质上你不是在测试你的应用程序代码。我总是使用 Blueprint 或 FactoryGirl 来创建有效对象,包括回调。
  • 我用cucumber做集成测试。当我进行单元测试时,我关心的唯一“真实”对象就是我正在测试的对象。
【解决方案2】:

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

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

self.update_attribute(:attribute, value)

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

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

您还可以在某些条件下更新所有记录

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

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

【讨论】:

  • 您不能在未保存的对象上调用update_attributes。目标是在不调用回调的情况下创建一个新对象。
  • 是的,我没有在问题中看到创建。
  • 顺便说一下,update_attribute 不运行验证。它确实运行回调。更新属性本质上只是 foo.attributes = hsh; 的简写。 foo.save
【解决方案3】:

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

我采用的解决方案是模拟 Model.find 并返回一个尚未保存的实例。这实际上是单元测试应该完成的方式,并且它们在启动时运行得更快。

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

  • rails3/activesupport/lib/active_support/callbacks.rb
  • rails3/activemodel/lib/active_model/callbacks.rb
  • rails/activerecord/lib/active_record/callbacks.rb

按这个顺序。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2012-01-04
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多