これは、私のプロジェクトの 1 つで、seed.rb ファイルに組み込んだサンプル スクリプトです。改善できると確信していますが、良い実例を提供しています。
プルしているすべてのアセットは app/assets/images 内に保存され、Info オブジェクトの名前と一致する名前が付けられます (スペースをアンダースコアに置き換え、名前を小文字にした後)。
はい、非効率的に聞こえますが、これらのアセットを FTP のどこかに配置することを除けば、Carrierwave と Fog を使用して、リモート サーバーがファイルを S3 に直接アップロードできることが最善の解決策です。
My Info モデルはhas_one
Gallery モデルにhas_many
関連付けられており、このモデルは Photo モデルに関連付けられています。Carrierwave アップローダーは、そのモデルの「ファイル」(文字列) 列にマウントされます。
Info.all.each do |info|
info_name = info.name.downcase.gsub(' ', '_')
directory = File.join(Rails.root, "app/assets/images/infos/stock/#{info_name}")
# making sure the directory for this service exists
if File.directory?(directory)
gallery = info.create_gallery
Dir.foreach(directory) do |item|
next if item == '.' or item == '..'
# do work on real items
image = Photo.create!(gallery_id: gallery.id)
image.file.store!(File.open(File.join(directory, item)))
gallery.photos << image
end
info.save!
end
end
これは私にとっては問題なく機能しますが、理想的には、S3 にアップロードするファイルをアセット フォルダー内にパッケージ化する必要はありません。私は提案と改善にオープンです。