据我了解,将.save!
包裹在ActiveRecord::Base.transaction
中将确保所有模型(用户,个人资料和设置)可以一起保存或完全不保存。
但是,我还被告知包括.save!与所有模型。保存!方法也可以做到这一点。因此,基本上,版本1和版本2是相同的。我有一种错的感觉,那有什么区别?
谢谢
def save
if valid?
ActiveRecord::Base.transaction do
User.save!
Profile.save!
Setting.save!
end
else
false
end
end
def save
if valid?
User.save!
Profile.save!
Setting.save!
else
false
end
end
参考:https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
答案 0 :(得分:2)
在第一种情况下,如果有任何保存!语句失败,那么所有先前保存的模型都将回滚。例如:
如果setting.save!
失败,则会回退setting.save!
,user.save!
和profile.save!
。
但是在第二种情况下,如果有任何保存!语句失败,那么它将仅回滚该语句,并且还会引发异常。例如:
如果setting.save!
失败,则仅setting.save!
将回滚。
两个语句仅在第一个语句“ user.save!”失败时才起作用。因为将会引发异常,而在第二种情况下,后续语句将不会执行
save
和save!
之间的区别在于,后者会引发异常,但是如果验证失败,两者都不会将对象的值保存到表中。