我正在尝试调试一些代码。一个奇怪的部分是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
从这个输出中,我只看到一个持久性调用。
我相信这是导致 ActiveRecord 持久save
化save!
对象的唯一方法。据我所知,其他持久化方法依赖于这两种方法之一;例如,update_attributes
来电save
、update_attributes!
来电save!
等。
是否有任何方法在不调用save
或的情况下保留 ActiveRecord 对象save!
?
(我正在使用 ActiveRecord 3.2.13)
更新
查看 3.2.13 的 Rails 源代码,既保存又保存!调用私有方法create_or_update
来完成他们的工作。我过去常常git grep
寻找其他出现的测试,create_or_update
并且只找到测试和callbacks.rb
包含它的东西。
create_or_update
反过来,依赖于klass.connection.update
和self.class.unscoped.insert
。
create_or_update
所以也许问题是除了持久化 ActiveRecord 对象之外是否还有其他东西。