是`save`和`save!`唯一可以保存ActiveRecord对象的方法吗?

时间:2013-06-07 12:22:31

标签: ruby rails-activerecord

我正在尝试调试一些代码。一个奇怪的部分是before_save回调被调用两次,但我只打算保存一次对象。

为了追踪这种情况,我在课堂上定义了这些方法:

%w[save save!].each do |method_name|
  define_method(method_name) do |*args|
    puts "who called '#{method_name}'? #{caller.first}"
    super(*args)
  end
end

从这个输出中,我只看到一个持久性调用。

我相信savesave!是导致ActiveRecord持久保存对象的唯一方法。据我所知,其他持久性方法依赖于这两者之一;例如,update_attributes调用saveupdate_attributes!调用save!等。

是否有任何方法在不调用savesave!的情况下保留ActiveRecord对象?

(我正在使用ActiveRecord 3.2.13)

更新

查看3.2.13的Rails源代码,savesave!调用私有方法create_or_update来完成他们的工作。我使用git grep查找create_or_update的其他匹配项,并且仅在callbacks.rb中找到包含它的测试和内容。

反过来,

create_or_update依赖于klass.connection.updateself.class.unscoped.insert

所以问题可能是create_or_update以外的其他内容是否持久存在ActiveRecord对象。

1 个答案:

答案 0 :(得分:1)

查看ActiveRecord 3.2.13 callbacks.rb,第264行。每当调用create_or_update时,都会触发保存回调。该方法仅通过保存和保存调用! update_column绕过create_or_update并使用update_all。 first_or_create调用create,调用save。

我正在两个地方寻找: 1.保存是否会在尝试再次保存原始模型的关联记录中触发保存?如果是这样,我希望再次调用save方法,所以很可能不会这样。 你确定before_save是被调用的吗?假设你有" before_save:do_something",并且do_something被调用两次。是否有任何调用:do_something在save的上下文之外?或者另一个before_save回调调用:do_something除了回调?