Ruby on Railsにて、Active Storageのインストール後に生成されるマイグレーションファイルの中身が気になったので、その仕組みを読み解いてみる。
〜Active Storage の導入コマンド〜
$ rails active_storage:install
↓
$ rails db:migrate
で、Active Storageが使えるようになる。
マイグレーションファイルに定義される3つのテーブル
- active_storage_blobsテーブル
- active_storage_attachementsテーブル
- active_storage_variant_recordsテーブル
active_storage_blobsテーブル
- ActiveStorage::Blobモデルのテーブル
- 添付されたファイルに対応
- 識別key(
:key
)、ファイル名(:filename
)、Content-Type(:content_type
)、ファイルのメタデータ(:metadata
)、サイズ(:byte_size
)などを管理
active_storage_attachementsテーブル
- ActiveStorage::Attachmentモデルのテーブル
- ActiveStorage::Blobモデルとアプリ内のモデルを関連付ける中間テーブル
- 関連付けるモデルのクラス名(
:record_type
)や連携するFKカラム名(:name
)を、FK値(:record_id
)と共に保持。 - ポリモーフィック関連付けがされている。
-
t.references :record, polymorphic: true
とすることで、record_type
とrecord_id
が自動生成される - メリット:ファイルがアップロードされるたびにactive_storage_attachementsテーブル&ActiveStorage::Attachmentモデルを更新する必要がなくなる
-
- 疑問点
なぜt.references :record, polymorphic: true, index: false
とココではindexを付与せずに、下記のように後でindexを追加しているのか?
t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true
→複合キーを作っている。関連づけるモデルのクラス名(:record_type
)、そのモデルのFKカラム名(:name
)、FK値(:record_id
)、BlobモデルのFK値(:blob_id
)を合わせた複合キーを作ることで、中間テーブルの役目を果たせる。
active_storage_variant_recordsテーブル
- ActiveStorage::Variantモデルのテーブル
- サイズの変更などの加工情報を記録する
参考