Вложение скрепки, не использующее правильное время update_at для строки запроса

Я использую Rails + Paperclip + S3. Я хочу разместить свои ресурсы в Cloudfront, используя один из моих кодов S3.

Я знаю, что Cloudfront кэширует активы, но вы можете разбить этот кеш, настроив его на пересылку строк запроса из источника.

Когда я изменяю актив, я ожидаю, что это произойдет

  • Временная метка updated_at объекта ActiveRecord обновлена.
  • Паперклип обновляет строку запроса изображения на S3, чтобы отобразить новое время updated_at.
  • Cloudfront обслуживает новое изображение из-за новой строки запроса timestamp.

Однако, похоже, что Paperclip неправильно обновляет метку времени updated_at. Может быть, он как-то кешировал. Поэтому строка запроса не обновляется, и Cloudfront никогда не разбивает кеш.

Моя модель:

class UserImage < ActiveRecord::Base
  has_attached_file :image
end

>> ui = UserImage.find(576925)
>> ui.image.class
=> Paperclip::Attachment

>> ui.touch

>> ui.updated_at.to_i
=> 1386241041

>> ui.image.updated_at
=> 1386240937

Эти две метки update_at должны быть одинаковыми.

Ответ 1

Похоже, что это могло быть ошибкой с более ранними версиями Paperclip (я на 2,7), поскольку он работает в будущих версиях.

Для справки это то, как я начал работать. В after_update на моей модели я принудительно обновляю экземпляр следующим образом:

image.instance_write(:updated_at, Time.now.utc)
self.send(:update_without_callbacks)

Мне пришлось сделать update_without_callbacks, чтобы он не застревал в бесконечном цикле обратного вызова.

Теперь время updated_at на вложении обновляется, вызывая обновление на Cloudfront.