RoR: ローカル ファイルからデータベースに画像をシードする方法
概要
Codecademy は、(seeds.rb 内) のような URL を介して画像をシードできることを示しています。
t1 = Tag.create(title: "Beaches", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach01.jpg")
Destination.create(name: "Ipanema", description: "The beach of Ipanema is known for its elegant development and its social life.", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg", tag_id: t1.id)
しかし、代わりに使用したいローカル ファイルがある場合はどうすればよいでしょうか?私のファイルパスはRubyで次のように与えられます。
File.join(Rails.root,'db','images','Event1.jpg')
使ってみた
image: File.open(File.join(Rails.root,'db','images','Event1.jpg'))
代わりに
image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg"
しかしうまくいきませんでした。
現在、ビュー内の画像にアクセスしています。
<%= image_tag t.image %>
どうすればこれを達成できますか?
解決策
まず、いくつかの概念を理解する必要があります。
それを理解したら、それを実際に実装する方法についていくつかのオプションを分析するとよいでしょう。
a.画像のバイナリ BLOB または Base 64 表現を保存します。実際に使用する前に、ローカルファイルに記述し、image_tag の引数として渡します。短所: 非常に非効率的です。それがあなたが最初にやろうとしていることなので、オプションとして入れましたが、それは実行可能ではないと思います。データベースは、単一列エントリに大量のデータを保持するように最適化されていません (これは DB エンジンとデータのクエリ方法に依存するため、割り引いて考えてください)。また、DB からの読み取りやローカル ファイルへの書き込みは非常に遅いため、そのイメージをできるだけ早く提供する必要があります。
b.ファイルへの参照を保存し、画像をローカルに保存します (たとえば、app/assets/images に保存できます)。次に、image_tag Rails.root.join(‘app’, ‘assets’, ‘images’, t.filename) で参照できます。短所: 画像が利用可能かどうかを簡単に知る方法はありません。
- CodeAcademy の例と同様に、画像を外部サービスに保存し、その画像への URL 参照を保存します。 AWS S3 など、そのために特別に設計されたサービスがいくつかあります。これらは一般に画像とファイルを提供するために高度に最適化されているため、画像をすべて単独で提供するよりも優れています。ただし、StackOverflow などの規模が大きい場合は、外部サービスを使用するよりも集中的に使用した方が良い/安価になる可能性があるため、独自のストレージ サービスを持ちたい場合があります。では、これらの外部サービスはどのようにしてそれを行うのでしょうか?はそれをディスクに直接保存する場合があります。次に、その URL にアクセスすると、プログラムは別のファイルと同じようにそのコンテンツを提供しますが、ブラウザーがそのコンテンツを解釈できるように必要なヘッダーを追加します (上記の概念 1. を参照)。編集: StackOverflow は外部サービスを使用します: imgur.com/gravatar.com、ブラウザの「要素の検査」ツールを使用して、自分の目で確認してください:)