2

背景
我正在使用文件系统存储,在模型设置 (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 }

是否有更好的方法可以根据我的需要从缓存中清除提升的图像?

4

1 回答 1

0

单张图片上传案例同步解决方案:

def create
  @my_model = MyModel.new(my_model_params)
  image_attacher = @my_model.image_attacher               
  image_attacher.create_derivatives                       # Create different sized images
  image_cache_id = image_attacher.file.id                 # save image cache file id as it will be lost in the next step
  image_attacher.record.save(validate: true)              # Promote original file to permanent storage
  Shrine.storages[:cache].delete(image_cache_id)  # Only clear cached image that was used to create derivatives (if other images are being processed and are cached we dont want to blow them away)
end
于 2019-12-13T02:13:14.153 回答