我正在尝试调试一些代码。一个奇怪的部分是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
从这个输出中,我只看到一个持久性调用。
我相信save
和save!
是导致ActiveRecord持久保存对象的唯一方法。据我所知,其他持久性方法依赖于这两者之一;例如,update_attributes
调用save
,update_attributes!
调用save!
等。
是否有任何方法在不调用save
或save!
的情况下保留ActiveRecord对象?
(我正在使用ActiveRecord 3.2.13)
查看3.2.13的Rails源代码,save和save!调用私有方法create_or_update
来完成他们的工作。我使用git grep
查找create_or_update
的其他匹配项,并且仅在callbacks.rb
中找到包含它的测试和内容。
create_or_update
依赖于klass.connection.update
和self.class.unscoped.insert
。
所以问题可能是create_or_update
以外的其他内容是否持久存在ActiveRecord对象。
答案 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除了回调?