Подтвердить что ты не робот

Каков правильный способ скопировать файл несущей с одной записи на другую?

Мне нужно скопировать файл из одного объекта несущей волны в другой. Это разные таблицы и разные типы загрузчиков.

Я начал с:

user.avatar = image.content

(где пользователь и изображение являются экземплярами модели, аватар и контент - это загруженные пользователем несущие), которые работали иногда. Кажется, он работает все время локально, с файловым хранилищем, но прерывистым при использовании тумана и s3.

В сообщении почтовый список Я нашел этот код:

user.avatar = image.content.file

который снова работал иногда.

До сих пор мое рабочее решение:

require "open-uri"

begin
  user.avatar = open(image.url)
rescue Errno::ENOENT => e
  begin
    user.avatar = open(image.path)
  rescue Errno::ENOENT => e
    # Ok, whatever.
  end
end

который не только уродлив, но и не проходит проверку расширения, поскольку открытие удаленного файла не поддерживает расширение (jpg, png и т.д.).

4b9b3361

Ответ 2

Из рассмотренных здесь решений я создал простой экземпляр CopyCarrierwaveFile, чтобы сделать это

используется примерно так:

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

Мне нужно было скопировать ссылку с одной модели на другую модель, и я был в состоянии сделать это, выполнив следующие действия:

my_new_model.update_column('attachment', my_other_model.attributes["attachment"]);

В этом сценарии я не хотел делать копию файла, и мне не хотелось, чтобы 2 записи были связаны с одним и тем же файлом (моя система никогда не удаляет или не изменяет файлы после загрузки).

Это может быть полезно для всех, кто хочет просто скопировать ссылку на файл с одной модели на другую, используя тот же загрузчик.

Ответ 4

Здесь (хотя и хакерское) решение для этого не требует HTTP-запроса для извлечения изображения:

module UploadCopier
  def self.copy(old, new)
    new.instance_variable_set('@_mounters', nil)

    old.class.uploaders.each do |column, uploader|
      new.send("#{column}=", old.send(column))
    end
  end
end

old_user = User.last
new_user = User.new
UploadCopier.copy(old_user, new_user)
new_user.save

Ответ 5

Я просто хотел скопировать аватар ссылку с одного объекта на другой, и для меня это было:

objectB.avatar.retrieve_from_store!(objectA.avatar.identifier)
objectB.save