LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-22

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3