web-dev-qa-db-ja.com

Carrierwave、含まれているモデルを複製するときに複製アタッチメントを作成する

モデルを複製したいのですが。元のモデルには、Carrierwaveを介した添付ファイルが含まれています。理想的には、新しいモデルオブジェクト用に、元の画像のコピーである新しい添付ファイルが作成されます。

Carrierwaveのドキュメントを調べて、この問題をグーグルで検索しましたが、元の画像の新しい複製を作成する解決策は見つかりませんでした。これは合理的ですか?可能?

25
eraticus

Carrierwaveにこのオプションがあるとは思わない。ただし、* _ remote_url =メソッドを使用して、新しいモデルの画像を最初のモデルの複製に設定できます。

これが簡単な例です

Has_one:photoがcarrierwaveに添付されたモデルがあるとします。モデルを複製し、写真を前の写真に設定して保存できます。例:

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番目のオブジェクトに新しいキャリアウェーブアタッチメントとして「コピー」されます。

30
derekyau

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

これは、Webサーバーを介して画像を2回ルーティングするよりも効率的です。

6
Martin M

このgemを試してください https://github.com/equivalent/copy_carrierwave_file 、ローカルストレージとフォグストレージの両方を処理します

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
5
equivalent8

CarrierWave 0.10を使用している私にとって、これは問題なく機能します。

user = User.first
dup_user = user.dup
dup_user.photo = user.photo
dup_user.save

S3のようなクラウドストレージを使用するときにこれがどのように機能するかはわかりませんが

1
Koen.