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



我正在尝试在我的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

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

根据活动记录交易:

还要记住,事务块中抛出的异常将被传播(在触发 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

像这样,一旦产品保存!引发错误,它就会自动在整个块中引发回滚。

最新更新