如何在rails中另一个保存失败时回滚保存



我有一个场景,我将在循环上更新Model1,循环结束后我将保存Model2,但我需要在Model2保存失败时回滚更新

@var1 = Model1.new
@var1.model2 = @var2
(1..5).each do |value|
  if (condition)
    @var1.send("field#{value}_st") = val1
    @var1.send("field#{value}_nd") = val2
    @var1.send("field#{value}_rd") = val3
    @var2.update_attributes(f1 => val4)
  end   
end
if @var1.save
 ....
 ....
else
 rollback
end

所以我想在@var1.save失败时回滚@var2的更新。我如何使用活动记录事务来做到这一点?

最简单的方法是使用ActiveRecord::Transactions

以金融事务为例,如果后续插入失败,则必须回滚一个插入。

ActiveRecord::Base.transaction do
  david.withdrawal(100)
  mary.deposit(100)
end

在现有的插入中尝试此操作。我认为这就是你想要的

@var1 = Model1.new
@var1.model2 = @var2
ActiveRecord::Base.transaction do
  (1..5).each do |value|
    @var1.send("field#{value}_st") = val1
    @var1.send("field#{value}_nd") = val2
    @var1.send("field#{value}_rd") = val3
    @var2.update_attributes(f1 => val4)   
  end
  @var1.save
end

最新更新