Фон
Я использую хранилище файловой системы с модулем Shrine :: Attachment в модель (my_model) с 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 task для очистки кешированных изображений.
Мне это действительно не нравится, поскольку я считаю, что кешированные файлы должны быть очищены после того, как файл был сохранен, а не оставлен как задача администратора (задание 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. Запустите 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 }
Есть ли более эффективные способы очистки продвигаемых изображений из кеша для моих нужд?