ActiveRecord :: Base.transaction с Rails .save - PullRequest
0 голосов
/ 02 марта 2019

Насколько я понимаю, обтекание .save! в ActiveRecord::Base.transaction обеспечит сохранение всех моделей (пользователя, профиля и настроек) вместе или ни одного вообще.

Однако мне также сказаличто в том числе. сохранить!со всеми моделями. сохранить!методы также сделают это.По сути, обе версии 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 голосов
/ 03 марта 2019

В первом случае, если любой из сохранить!оператор не выполняется, тогда все предыдущие сохраненные модели будут откатаны.Например: если setting.save! завершится неудачей, то setting.save!, user.save! и profile.save! будут откатаны.

Но во втором случае, если есть, сохранить!оператор не выполняется, тогда он будет только откатывать этот оператор, а также вызовет исключение.Например: если setting.save! завершится неудачно, будет выполнен откат только setting.save!.

Оба оператора будут работать одинаково только в 1 случае, когда первый оператор завершится неудачно 'user.save!'как исключение, и во втором случае последующее утверждение не будет выполнено

Разница между save и save! заключается в том, что последнее вызовет исключение, но оба не сохранят значение объекта в таблицу.если проверки не пройдены.

...