ruby - `save` 和 `save!` 是唯一持久化 ActiveRecord 对象的方法吗?

标签 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!调用私有(private)方法 create_or_update 来完成他们的工作。我使用 git grep 寻找其他出现的 create_or_update 并且只在 callbacks.rb 中找到了测试和一些东西。

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

所以问题可能是除了 create_or_update 之外是否还有其他东西持久化 ActiveRecord 对象。

最佳答案

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

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

关于ruby - `save` 和 `save!` 是唯一持久化 ActiveRecord 对象的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16984043/

相关文章:

ruby-on-rails - 如何保证回调顺序?

mysql - Ruby on Rails : ActiveRecords' first_or_create is very slow

arrays - 使用数组键进行哈希到哈希的简单哈希

ruby-on-rails - 检索在 ActiveRecord/Rails 中没有关系的对象

ruby-on-rails - Rails 迁移 : self. up 和 self.down 与更改

ruby-on-rails - Rails 将元素添加到一对多关联

ruby - 设置环境变量,无需在字符串和整数之间进行转换

mysql - Active Record 精度小数值被截断

ruby - 获取没有文本节点的元素的子元素

ruby-on-rails - 如何在 Ruby 中将 Mass Pay API 与新的 REST API 结合使用?