背景
我正在使用文件系统存储,在模型设置 (my_model) 中使用 Shrine::Attachment 模块,并使用 activerecord (Rails)。我也在直接上传场景中使用它,因此我需要文件上传的响应(保存到缓存)。
my_model.rb
class MyModel < ApplicationRecord
include ImageUploader::Attachment(:image) # adds an `image` virtual attribute
omitted relations & code...
end
my_controller.rb
def create
@my_model = MyModel.new(my_model_params)
# currently creating derivatives & persisting all in one go
@my_model.image_derivatives! if @my_model.image
if @my_model.save
render json: { success: "MyModel created successfully!" }
else
@errors = @my_model.errors.messages
render 'errors', status: :unprocessable_entity
end
目标
理想情况下,我只想清除我目前在创建控制器中持有的缓存文件,只要它们被持久化(衍生文件和原始文件)到永久存储。
对于场景 A:同步和场景 B:异步,最好的方法是什么?
我考虑过/尝试过
的内容 在阅读完文档后,我注意到 3 种可能的清除缓存图像的方法:
1.运行rake 任务以清除缓存图像。
我真的不喜欢这样,因为我相信缓存文件应该在文件被持久化后被清理,而不是作为无法使用图像持久性规范测试的管理任务(cron 作业)
# FileSystem storage
file_system = Shrine.storages[:cache]
file_system.clear! { |path| path.mtime < Time.now - 7*24*60*60 } # delete files older than 1 week
2.在after 块中运行 Shrine.storages[:cache]
这仅适用于后台作业吗?
attacher.atomic_persist do |reloaded_attacher|
# run code after attachment change check but before persistence
end
3. 将缓存文件移动到永久存储
我不认为我可以使用它,因为我的直接上传发生在两个不同的部分:1,立即将附件上传到缓存存储,然后 2,将其保存到新创建的记录中。
plugin :upload_options, cache: { move: true }, store: { move: true }
是否有更好的方法可以根据我的需要从缓存中清除提升的图像?