Railsアプリケーションにファイルを簡単にアップロードするgem「Shrine」と「ActiveStorage」
これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール 第10回
ダウンロード サンプルファイル (139.6 KB)
ActiveStorageの導入(1)
ここからは、Rails 5.2から導入された、ActiveStorageを使った実装例を紹介します。なお、適用したマイグレーションはこれまで同様にいったんロールバックしておいてください。
bin/rails db:rollback
マイグレーション
Rails 5.2で導入されているので、新たにbundle installなどをする必要はありません。
ActiveStorageはここまで紹介してきたgemとテーブルの設計が違い、アップロードファイルに関する2つの専用テーブルで管理します。
以下のコマンドでActiveStorage用のマイグレーションファイルを作成します。
bin/rails active_storage:install
▼
1 file changed, 26 insertions(+) create mode 100644 db/migrate/20181219111032_create_active_storage_tables.active_storage.rb
生成されたマイグレーションファイルを確認すると、以下の通り、2つのテーブルを追加するcreate_table構文が定義されています。各テーブルのカラムの役割については後ほど解説します。
# This migration comes from active_storage (originally 20170806125915)
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
def change
create_table :active_storage_blobs do |t|
t.string :key, null: false
t.string :filename, null: false
t.string :content_type
t.text :metadata
t.bigint :byte_size, null: false
t.string :checksum, null: false
t.datetime :created_at, null: false
t.index [ :key ], unique: true
end
create_table :active_storage_attachments do |t|
t.string :name, null: false
t.references :record, null: false, polymorphic: true, index: false
t.references :blob, null: false
t.datetime :created_at, null: false
t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
end
end
end
active_storage_blobsテーブルには、画像ファイルの情報が格納されます。active_storage_attachmentsテーブルには、関連付けに関する基本情報が格納されます。
以下の通りマイグレーションを実行します。
bin/rails db:migrate
マイグレーションを実行した結果、生成されるテーブルの構成を確認します。以下のコマンドでデータベースに接続します。
bin/rails dbconsole
続いて以下のコマンドを実行して生成されたカラムを確認します。
kaminari_sample_development=# \d active_storage_blobs
kaminari_sample_development=# \d active_storage_attachments
生成された、テーブルごとのカラムの用途は以下の通りです。
| カラム名 | 用途 |
|---|---|
| id | プライマリーキー |
| key | ファイル固有のキー |
| filename | アップロード時のファイル名 |
| content_type | アップロードされたファイルのContent-Type |
| byte_size | アップロード時のファイルサイズ |
| checksum | ファイルのチェックサム |
| created_at | ファイルの作成日時 |
| カラム名 | 用途 |
|---|---|
| id | プライマリーキー |
| name | ファイルをアタッチする際のキー名(詳細は後述) |
| record_type | モデル名 |
| record_id | モデルに対応するテーブルのプライマリーキー |
| blob_id | active_storage_blobsテーブルのプライマリーキー |
| created_at | ファイルの作成日時 |
このように、record_typeとrecord_idを用いて「ポリモーフィック関連」を定義してモデルに対応するテーブルと関連付けを行っています。
[Tips]ポリモーフィック関連とは
ポリモーフィック関連とは、複数のモデルを1つのテーブルで関連付けるための仕組みです。
ActiveRecordでは、[リソース名]_typeと[リソース名]_idの2つのカラムを定義することで実現することができます。
ActiveStorageの例では、record_typeにモデル名を、record_idにモデルのプライマリーキーを入れて関連付けるモデルを複数定義しています。
ActiveStorageの設定ファイル
Rails 5.2では、rails newしたときにActiveStorage用の設定ファイルであるstorage.ymlが生成されます。設定ファイルを確認します。
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
…(中略)…
デフォルトでは、testとlocalの2つの設定が有効になっています。
serviceには、ファイルアップロードで使うサービス名を記述します。この2つの場合は、Diskが定義されています。Diskの場合、ファイルのアップロード先はRailsが動いているアプリケーションサーバー上のディスクとなります。rootにはアップロードするルートパスを記述します。
コメントアウトされている部分に注目すると、例えばAmazon S3を使う場合は、amazonディレクティブを定義してserviceにS3を記述します。
storage.ymlに定義したディレクティブを環境ごとに使い分ける場合、config/environmentsディレクトリの環境ごとの設定ファイルにactive_storage.serviceを設定します。developmentモードの設定ファイルを確認すると、以下のように:localが定義されています。
…(中略)… # Store uploaded files on the local file system (see config/storage.yml for options) config.active_storage.service = :local …(中略)…
このようにdevelopmentモードの場合、storage.ymlに定義されているlocalディレクティブの設定を使います。productionモードではAmazon S3を使う場合、active_storage.serviceの値を:amazonとすれば、storage.ymlのamazonディレクティブの値を使います。
この記事は参考になりましたか?
- これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール連載記事一覧
-
- Ruby製HTTPクライアント用gemの「Faraday」を使おう
- Railsアプリケーションにファイルを簡単にアップロードするgem「Shrine」と「Ac...
- Railsアプリケーションにファイルを簡単にアップロードするgem「CarrierWave...
- この記事の著者
-
WINGSプロジェクト 竹馬 力(チクバ ツトム)
< WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
