如何彻底删除Rails ActiveStorage中特定附件的所有变体(保留原文件)
如何彻底删除Rails ActiveStorage中特定附件的所有变体(保留原文件)
我之前刚好处理过一模一样的需求,你的思路方向是对的,但只删除ActiveStorage::VariantRecord确实不够——因为Rails不会自动帮你清理变体对应的实际存储文件,而且变体本身也没有独立的active_storage_blobs记录(变体是基于原blob生成的,所有变体关联的都是原blob)。
给你一套完整的解决方案,既能删干净数据库里的变体记录,也能把/storage下的变体文件彻底移除:
# 先拿到原附件对应的Blob对象 original_blob = @avatar.file.blob # 找出所有关联该原Blob的变体记录 variant_records = ActiveStorage::VariantRecord.where(blob_id: original_blob.id) # 遍历每个变体,先删除对应的存储文件 variant_records.each do |variant| # 通过ActiveStorage的存储服务删除变体文件(本地存储就是/storage下的对应文件) ActiveStorage::Blob.service.delete(variant.variant.key) end # 最后删除数据库里的变体记录 variant_records.destroy_all
为什么要这么做?
- 单独调用
destroy_all只会删除active_storage_variant_records表中的数据,但不会触发文件系统的删除操作,因为ActiveStorage对变体的文件清理没有自动绑定销毁回调。 - 变体没有自己的
Blob记录,所以不需要操作active_storage_blobs表,原文件的Blob和存储文件会完整保留。
这样操作后,旧的变体就被彻底清掉了,你再重新生成新变体时就不会有旧文件干扰啦~
备注:内容来源于stack exchange,提问作者TomDogg
相关产品推荐
相关产品推荐

