Вы можете использовать new_record? , чтобы проверить, является ли file
новым, то есть:
def set_filename
if file.attached? && file.new_record?
self.file.blob.update(filename: "#{new_file_name()}.#{self.file.blob.content_type.split('/')[1]}")
end
end
В качестве альтернативы, используйте before_create
вместо before_save
, чтобы только set_name
запускается при загрузке нового файла.
Обновлено
Интересно, что ActiveStorage обрабатывает изменения больших двоичных объектов вне хуков модели.По-видимому, сейчас он даже не поддерживает проверку.Нет никакого способа проверить, что блоб изменился, поскольку его состояние нигде не сохраняется.Если вы загляните в журнал rails, обратите внимание, что rails удаляет старый BLOB-объект, как только добавляется новый.
Несколько вариантов, которые я могу вспомнить:
1. Обновление имени файла в контроллере, например:
original_name = params[:file].original_name
params[:file].original_name = # your logic goes here
2. Сохраните имя файла BLOB-объекта в родительской модели и сравните в before_save
.
def set_filename
if file.attached? && file.blob.filename != self.old_filename
self.file.blob.update(filename: "#{new_file_name()}.#{self.file.blob.content_type.split('/')[1]}")
end
end
Ни одно из этих решений не является идеальным, но надеюсь, что оно даст вам некоторые идеи.