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
モデルを更新します。
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
ファイルの完全な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の貢献に感謝します、ジョージ:)
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