以下のページの記載内容が前提
https://blog.otsukasatoshi.com/entry/2016/05/04/185133
https://github.com/carrierwaveuploader/carrierwave#multiple-file-uploads
https://qiita.com/ggtmtmgg/items/ba5f275c122c83013ea1
はじめに
Ruby on Railsでウェブアプリを作る際、画像をデータベースに保存する処理が必要となった際はだいたいの人が「Carrierwave」を使うのではなかろうか。私もその一人で、導入自体は容易でしたが、複数画像をアップロードしようとして少しハマったので備忘録を兼ねて記事にします。
インストール
Gemで容易にインストール可能なので割愛。
DBについて
SQLiteを使うか、postgreSQLで扱いが異なり、postgreSQLについては上記サイト等多数のページで解説されているため、ここではSQLiteについてのみ言及します。
カラムについて
SQLiteはpostgreSQLと違いJSON型のカラムに対応していないため、解説サイトどおりにやると詰まります。String型のカラムを用意しておきます(arrayにする必要はない)。
Modelについて
class Post < ApplicationRecord
mount_uploaders :images, ImageUploader
serialize :images, JSON
end
mount_uploaders :images, ImageUploader
は、PostモデルにCarrierwaveを関連付けている行です。複数画像の場合、mount_uploader
ではなくmount_uploaders
にすること。
serialize :images, JSON
は、テキスト型のカラムに配列を格納するための行です。形式をJSON型にしています。つまり、データ自体はString型だけれども、その実態はJSONデータという訳です。
DBへの保存
<%= form.file_field :images, multiple: true %>
実際のフォームの書き方です。multiple: true
とし、複数のファイルを選択できるようにしています。
DBからの読み込み
@selectedPost.images
に、画像の(ルートから見た)相対パスが、画像の数を要素数とする配列として格納されています。
おわりに
そもそもpostgreSQLを使えば詰まりませんでしたが、RailsのデフォルトがSQLiteで、postgreSQLにしようとしたらめんどくさくて、しかもpostgreSQLにするメリットが知識がなくわからないので、なるべくSQLiteで進めたかったためにちょっとハマってしまった訳です。プログラマーにとって怠惰は美徳と言われていた気がしますが、勉強はだいじだなぁとおもいましたまる