モデルを複製したいのですが。元のモデルには、Carrierwaveを介した添付ファイルが含まれています。理想的には、新しいモデルオブジェクト用に、元の画像のコピーである新しい添付ファイルが作成されます。
Carrierwaveのドキュメントを調べて、この問題をグーグルで検索しましたが、元の画像の新しい複製を作成する解決策は見つかりませんでした。これは合理的ですか?可能?
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番目のオブジェクトに新しいキャリアウェーブアタッチメントとして「コピー」されます。
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回ルーティングするよりも効率的です。
この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
CarrierWave 0.10を使用している私にとって、これは問題なく機能します。
user = User.first
dup_user = user.dup
dup_user.photo = user.photo
dup_user.save
S3のようなクラウドストレージを使用するときにこれがどのように機能するかはわかりませんが