我试图在我的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
答案 0 :(得分:0)
不知道我是否完全理解你的问题,但似乎你想要回滚整个交易。在这种情况下,你的问题是这个救援。
另外请记住,事务块中抛出的异常将被传播(在触发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中自动引发整个块的回滚!提出错误。