在事务操作中保存对象列表

时间:2017-08-22 15:08:29

标签: ruby-on-rails transactions rails-postgresql

我试图在我的postgres数据库中保存excel文件中的对象列表。它必须在交易中完成。

从下面的代码中我无法从无效案例中回滚事务。保存一些无效案例之前的对象,然后在之后完成事务。

class UploadFile < ApplicationRecord
  # Others validations 

  def save_from_file
    # open file 
    Product.transaction do
      begin
        (2..file.last_row).each do |n|
          product = Product.new(id: file.cell(n,1), price: file.cell(n,2))
          product.save!
        end
      rescue ActiveRecord::RecordInvalid
        raise ActiveRecord::Rollback
      end
    end
  end

end

1 个答案:

答案 0 :(得分:0)

不知道我是否完全理解你的问题,但似乎你想要回滚整个交易。在这种情况下,你的问题是这个救援。

根据Active Record Transactions

  

另外请记住,事务块中抛出的异常将被传播(在触发ROLLBACK之后),因此您应该准备好捕获应用程序代码中的异常。

     

一个例外是ActiveRecord :: Rollback异常,它会在引发时触发ROLLBACK,但不会被事务块重新引发。

因此,如果你在救援中引发回滚,它不会触发事务阻止回滚,它只会回滚该特定对象。为了触发块回滚,它应该是:

Product.transaction do
  (2..file.last_row).each do |n|
    product = Product.new(id: file.cell(n,1), price: file.cell(n,2))
    product.save!
  end
end

就像这样,它会在product.save中自动引发整个块的回滚!提出错误。