Ruby 是‘save’和‘save!’保存ActiveRecord对象的唯一方法是什么?
我正在调试一些代码。奇怪的是,save之前的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 从这个输出中,我只看到一个持久性调用 我相
回调调用了两次,尽管我只打算保存对象一次
为了跟踪这是如何发生的,我在类中定义了以下方法:
%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 multipleallowen\u to
。