Ruby 是‘save’和‘save!’保存ActiveRecord对象的唯一方法是什么?

Ruby 是‘save’和‘save!’保存ActiveRecord对象的唯一方法是什么?,ruby,rails-activerecord,Ruby,Rails Activerecord,我正在调试一些代码。奇怪的是,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 从这个输出中,我只看到一个持久性调用 我相

我正在调试一些代码。奇怪的是,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
从这个输出中,我只看到一个持久性调用

我相信
save
save是导致ActiveRecord持久化对象的唯一方法。据我所知,其他持久性方法依赖于这两种方法之一;例如,
update\u attributes
调用
save
update\u attributes调用
保存,等等

是否有任何方法在不调用
save
save的情况下保存ActiveRecord对象

(我正在使用ActiveRecord 3.2.13)

更新 在Rails源代码中查找3.2.13,并调用私有方法
create\u或\u update
。我使用
git grep
查找其他出现的
create\u或\u update
,只在
callbacks.rb中找到了测试和包装它的东西

create\u或\u update
依次依赖于
klass.connection.update
self.class.unscoped.insert


因此,问题可能在于,除了创建或更新之外,是否有任何东西可以持久化ActiveRecord对象。

查看ActiveRecord 3.2.13 callbacks.rb,第264行。每当调用create\u或\u update时,都会触发save回调。该方法仅由save和save!调用!。“更新”列绕过“创建”或“更新”,而是使用“全部更新”。首先_或_create调用create,它调用save

我将在两个地方寻找: 1.保存是否会触发在关联记录中的保存,以尝试再次保存原始模型?如果是这样的话,我希望save方法再次被调用,所以很可能不是这样。
2.您确定所调用的是before_save吗?假设你有“在保存之前:做点什么”,并且做点什么会被调用两次。是否有任何东西在调用:do_save上下文之外的内容?或另一个在保存回调调用之前:除了回调之外,您还需要做什么吗

还有像
first\u或\u create这样的东西‎。如何保存对象?这里有点像是在黑暗中拍摄,但我注意到当我不小心复制关联时也会发生类似的情况,例如,la multiple
allowen\u to