Поскольку вложения определены на уровне класса, Paperclip интерполирует символы в строках, используя свою собственную библиотеку интерполяции.Используя эту библиотеку, вы можете создавать свои собственные интерполяции.
Я бы добавил в модель поле с именем attachment_version
или что-то подобное, а затем увеличивал бы этот номер версии при каждом изменении файла.Затем создайте для него интерполяцию в файле инициализатора:
Paperclip.interpolates :version do |attachment, style|
attachment.instance.attachment_version
end
Теперь вы можете использовать :version
в своих строках:
class Model < ActiveRecord::Base
has_attached_file :something, :path => " :rails_root/public/somethings/etc/:version.:extension"
end
См. Вики-документация для получения дополнительной информации.
[Обновление]
После некоторого осмотра (см. комментарии к этому ответу) я пришел к выводу, что Скрепка будет все еще удалить старое вложение из-за кода, который вызывается в Paperclip::Atachment#attach
.Вероятно, лучший способ справиться с этим - создать новый механизм хранения на основе Paperclip::Storage::Filesystem
и перезаписать #flush_deletes
.Обратите внимание, что в этом методе нет способа определить, находится ли файл в очереди на удаление из-за модели, к которой он относится, или на его место загружается новый файл.