ActiveRecord :: Base.transaction与Rails .save

时间:2019-03-02 19:34:58

标签: ruby-on-rails activerecord 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

版本2

def save
  if valid?
      User.save!
      Profile.save!
      Setting.save!      
  else
    false
  end
end

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

1 个答案:

答案 0 :(得分:2)

在第一种情况下,如果有任何保存!语句失败,那么所有先前保存的模型都将回滚。例如: 如果setting.save!失败,则会回退setting.save!user.save!profile.save!

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

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

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