You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:46:03