Carrierwave, создавая дублирующее приложение при дублировании его содержащей модели
Я хотел бы дублировать модель. Оригинальная модель содержит вложение через Carrierwave. В идеале для нового объекта модели будет создано новое вложение, то есть копия исходного изображения.
Я просмотрел документацию Carrierwave и искал эту проблему, но не нашел решения, которое создает новый дубликат исходного изображения. Это разумно? Возможно ли это?
Ответы
Ответ 1
Я не верю, что у Carrierwave есть этот вариант. Однако вы можете использовать метод * _remote_url =, чтобы установить новое изображение модели как дубликат первого.
Вот краткий пример
Скажем, у меня есть модель, у которой has_one: фото прикреплено к несущей. Я могу дублировать, модель, установить фотографию на предыдущую и сохранить ее. Пример:
first_model = User.first
duplicate_model = first_model.dup #(where the dup code duplicates everything else you need)
duplicate_model.remote_photo_url = first_model.photo_url
duplicate_model.save
Это позволит "скопировать" фотографию с первого объекта на вторую в качестве нового приложения с несущей.
Ответ 2
Попробуйте этот камень https://github.com/equivalent/copy_carrierwave_file, он обрабатывает как локальное хранилище, так и хранилище Fog
original_resource = User.last
new_resource = User.new
CopyCarrierwaveFile::CopyFileService.new(original_resource, new_resource, :avatar).set_file
new_resource.save
nev_resource.avatar.url # https://...image.jpg
Ответ 3
В то время как copy_carrierwave_file
- это аккуратный камень, он не нужен, если вы используете локальное хранилище.
carrierwave
может использовать локальные файлы в качестве источника вложений, и вы можете использовать его для дублирования вложения:
first_user = User.first
duplicate_user = first_user.dup
duplicate_user.photo = File.open(first_user.photo.file.file) if first_user.photo.present?
duplicate_user.save
Это более эффективно, чем маршрутизация изображения дважды через веб-сервер.
Ответ 4
Для меня с CarrierWave 0.10 это работает отлично:
user = User.first
dup_user = user.dup
dup_user.photo = user.photo
dup_user.save
Хотя я не уверен, как это получается при использовании облачного хранилища, такого как S3