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。