【发布时间】:2021-02-25 16:58:03
【问题描述】:
我正在使用 ActiveStorage 来处理我的 rails 应用程序中的附件。
更新模型的附件时,它似乎将清除作业排入队列,并删除了远程存储服务上以前的附件(此处为S3)。
我不希望我的S3 存储桶中的文件被系统地删除(即使我的数据库中没有附加记录),是否可以防止这些清除作业被排队?
【问题讨论】:
标签: ruby-on-rails rails-activestorage
我正在使用 ActiveStorage 来处理我的 rails 应用程序中的附件。
更新模型的附件时,它似乎将清除作业排入队列,并删除了远程存储服务上以前的附件(此处为S3)。
我不希望我的S3 存储桶中的文件被系统地删除(即使我的数据库中没有附加记录),是否可以防止这些清除作业被排队?
【问题讨论】:
标签: ruby-on-rails rails-activestorage
如@yoLotus所述
如果没有为附件设置:dependent 选项,则默认为:purge,这会导致它在删除相关记录时删除附件。
要覆盖此行为,您必须将 :dependent 选项设置为 :purge_later。
假设您有一个附有图像的帖子,并且您不想在帖子被删除时删除附加的图像。
你会怎么做:
has_one_attached :image, dependent: :purge_later
【讨论】:
再次阅读文档后:
如果未设置
:dependent选项,则只要记录被销毁,附件就会被清除(即销毁)。
【讨论】:
可以这样做:
has_one_attached :photo, dependent: :detach
编写自定义 S3 服务也可以解决问题:
require "active_storage/service/s3_service"
class ActiveStorage::Service::CustomS3Service < ActiveStorage::Service::S3Service
attr_reader :detach
def initialize(bucket:, upload: {}, **options)
@detach = options[]
end
def delete(key)
instrument :delete, key: key do
detach ? object_for(key).detach : object_for(key).delete
end
end
end
【讨论】: