web-dev-qa-db-ja.com

Rails 5.2でActiveStorageに保存されているファイルを複製するにはどうすればよいですか?

ActiveStorageを使用しているモデルがあります。

class Package < ApplicationRecord
  has_one_attached :poster_image
end

最初のposter_imageファイルの複製を含むPackageオブジェクトのコピーを作成するにはどうすればよいですか。以下に沿ったもの:

original = Package.first
copy = original.dup
copy.poster_image.attach = original.poster_image.copy_of_file
15
Robban

モデルを更新します。

class Package < ApplicationRecord
  has_one_attached :poster_image
end

ソースパッケージのポスター画像blobをターゲットパッケージに添付します。

source_package.dup.tap do |destination_package|
  destination_package.poster_image.attach(source_package.poster_image.blob)
end
16
George Claghorn

ファイルの完全なcopyが必要な場合は、元のレコードの両方に、複製されたレコードに添付の独自のコピーが含まれるようにします。ファイル、これを行います:

Rails 5.2、grab this code and put it in config/initializers/active_storage.rb、次にこのコードを使用してコピーを行います。

ActiveStorage::Downloader.new(original.poster_image).download_blob_to_tempfile do |tempfile|
  copy.poster_image.attach({
    io: tempfile, 
    filename: original.poster_image.blob.filename, 
    content_type: original.poster_image.blob.content_type 
  })
end

Rails 5.2(リリースに this commit が含まれている場合は常に)の後、次のようにすることができます。

original.poster_image.blob.open do |tempfile|
  copy.poster_image.attach({
    io: tempfile, 
    filename: original.poster_image.blob.filename, 
    content_type: original.poster_image.blob.content_type 
  })
end

元の答えとRailsの貢献に感謝します、ジョージ:)

10
Benjamin Curtis

Railsのテスト、特に をblobモデルテストで調べて答えを見つけた

したがって、この場合

class Package < ApplicationRecord
  has_one_attached :poster_image
end

添付ファイルをそのまま複製できます

original = Package.first
copy = original.dup
copy.poster_image.attach io: StringIO.new(original.poster_image.download),
                         filename: original.poster_image.filename,
                         content_type: original.poster_image.content_type

同じアプローチがhas_many_attachmentsでも機能します

class Post < ApplicationRecord
  has_many_attached :images
end

original = Post.first
copy = original.dup

copy.images.each do |image|
  copy.images.attach io: StringIO.new(original.poster_image.download),
                     filename: original.poster_image.filename,
                     content_type: original.poster_image.content_type
end
2
jethro