Rails 6中如何在不同模型间复用Active Storage附件?
解决Rails ActiveStorage附件复用报错问题
你的报错是因为attach方法不接受ActiveStorage::Attachment对象作为参数,它需要的是可附加资源(attachable),比如ActiveStorage::Blob实例、文件IO、或者包含文件信息的哈希。结合你的需求(删除原记录不影响新附件,且两者各自关联),提供两种可行方案:
方案一:创建独立的Blob副本(完全隔离)
如果需要两个记录的附件完全独立(修改或删除其中一个的Blob不会影响另一个),可以复制原Blob的所有信息和文件内容,生成新的Blob后关联:
# 获取原OutInvoice的附件Blob original_blob = out_invoice.physical_copy.blob # 复制Blob元数据并创建新Blob new_blob = ActiveStorage::Blob.create!( filename: original_blob.filename, content_type: original_blob.content_type, metadata: original_blob.metadata, byte_size: original_blob.byte_size, checksum: original_blob.checksum ) # 将原文件内容上传到新Blob new_blob.upload(original_blob.download) # 关联新Blob到InInvoice in_invoice.physical_copy.attach(new_blob)
方案二:共享同一个Blob(高效且满足需求)
如果只是需要复用文件内容,且接受两个记录关联同一个Blob(原记录删除时,原Attachment会被删除,但Blob会保留,因为新记录的Attachment仍关联着它),可以直接关联原Blob:
# 直接关联原附件的Blob对象,而非Attachment in_invoice.physical_copy.attach(out_invoice.physical_copy.blob)
错误原因说明
你之前的代码中the_physical_out_invoice返回的是physical_copy.attachment(ActiveStorage::Attachment实例),这不是attach方法接受的参数类型。attach方法支持的参数包括:
ActiveStorage::Blob实例- 本地文件路径字符串
- 文件IO对象
- 包含
:io、:filename等键的哈希
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

