一覧に戻る

Carrierwaveで複数の画像をSQLiteのDBに保存する

#Ruby#Rails#DB#SQLite3

以下のページの記載内容が前提 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で進めたかったためにちょっとハマってしまった訳です。プログラマーにとって怠惰は美徳と言われていた気がしますが、勉強はだいじだなぁとおもいましたまる