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ディレクティブの値を使います。
