Ruby on rails Rails 6 ActiveStorage在文件上载失败时还原事务
我有一个非常简单的场景,我正在创建一个记录,而不是附加一个文件(在Ruby on rails Rails 6 ActiveStorage在文件上载失败时还原事务,ruby-on-rails,rails-activerecord,rails-activestorage,Ruby On Rails,Rails Activerecord,Rails Activestorage,我有一个非常简单的场景,我正在创建一个记录,而不是附加一个文件(在保存!之后,因为我需要记录上的id来生成附件的finename),所有这些都被包装在一个事务中 比如: def create ActiveRecord::Base.transaction do record = A.create!(a_params) pdf = generate_pdf record.file.attach( io: StringIO.new(pdf), fil
保存!
之后,因为我需要记录上的id来生成附件的finename),所有这些都被包装在一个事务中
比如:
def create
ActiveRecord::Base.transaction do
record = A.create!(a_params)
pdf = generate_pdf
record.file.attach(
io: StringIO.new(pdf),
filename: "PO##{record.id}.pdf",
content_type: 'application/pdf'
)
rescue
# here it should rollback transaction on all kind of errors, if it fails upload or whatever, but it does not
raise ActiveRecord::Rollback
end
end
但activestorage只有在提交后才会上载文件,所以这种内部救援根本不起作用,有效的方法是:
def create
record = nil
ActiveRecord::Base.transaction do
record = A.create!(a_params)
pdf = generate_pdf
record.file.attach(
io: StringIO.new(pdf),
filename: "PO##{record.id}.pdf",
content_type: 'application/pdf'
)
end
rescue
record&.destroy!
end
这里我简化了这个场景,实际上我有一个场景,在一个循环中创建了很多记录,我不想在出现任何错误时保存任何记录
我发现了一些问题,比如:
如何以最佳方式解决此问题,我了解到,活动存储在后台上载文件,以避免事务持续时间过长。因为否则会产生问题。这是有道理的,我认为我还应该将pdf_生成逻辑从事务中删除
但是我想知道,只有正确生成并上传pdf,是否有更好的方法来创建记录。而不是手动销毁它们,并在出现错误时将任何其他更新还原到DB。