ActiveRecord::Base.transaction 与 Rails .save

use*_*677 1 activerecord ruby-on-rails ruby-on-rails-5.2

据我了解,换.save!行将 ActiveRecord::Base.transaction确保所有模型(用户、配置文件和设置)保存在一起或根本不保存。

但是,我还被告知包括 .save!与所有模型。保存!方法也能做到这一点。所以本质上,版本 1 和 2 是相同的。我感觉我错了,那有什么区别呢?

谢谢

版本1

def save
  if valid?
    ActiveRecord::Base.transaction do
      User.save!
      Profile.save!
      Setting.save!
    end
  else
    false
  end
end
Run Code Online (Sandbox Code Playgroud)

版本2

def save
  if valid?
      User.save!
      Profile.save!
      Setting.save!      
  else
    false
  end
end
Run Code Online (Sandbox Code Playgroud)

参考: https: //api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

Rat*_*dav 5

在第一种情况下如果有的话保存!语句失败则所有之前保存的模型将被回滚。例如:如果setting.save!失败,则setting.save!user.save!profile.save!将被回滚。

但在第二种情况下,如果有保存的话!语句失败,那么它只会回滚该语句,并且还会引发异常。例如:如果setting.save!失败则只会setting.save!回滚。

仅在第一个语句失败“user.save!”的情况下,这两个语句才会起作用。因为将引发异常,并且在第二种情况下,后续语句将不会被执行

save和之间的区别save!在于,后者会引发异常,但如果验证失败,两者都不会将对象的值保存到表中。