🔥

【Rails】ActiveStorageの特徴

2023/11/01に公開

PF作成にてテーブル作成時に認識があやふやだったので特徴を振り返ろうと思います。
ここでは特徴の確認のため導入方法については割愛されます。

ActiveStorageとは

Railsで画像の投稿や表示を行うためのものです。画像は通常のカラムとして保存できないため、特別な保存方法が必要になり、それを行うのがActiveStorageです。

ActiveStorageの特徴

  • 画像用のカラムを用意する必要がない
  • 画像を保存させるために紐づいているモデルに対して保存用のカラムを持たせる必要がない。
  • usersテーブルにカラムを追加する必要がない

ActiveStorageは、アセット(ファイル)がデータベースに直接格納されず、ストレージに保存される仕組みが採用されているため、画像用のカラムを用意する必要がないとのことです。
Active Storageを使うことで、複数のバックエンドストレージを組み合わせて使用することも可能になります。

登録された画像はどこでどのように登録されているか

導入時に作成されるテーブル

ActiveStorage導入時に下記のテーブルが自動作成されます。

  • active_storage_attachments
    モデルレコードとの紐付きを保存する、中間テーブル
  • active_storage_blobs
    実際に画像をカラムに保持しているテーブル

下記の記述通りactive_storage_blobsの中にmetadataというカラムがありその中に画像が文字列のデータとして格納されています。

schema.rb
create_table "active_storage_blobs", force: :cascade do |t|
   :
    t.text "metadata"
   :
  end

画像レコードとモデルの紐付けの仕組み

active_storage_attachmentsは複数モデルで画像を扱っても1つのテーブルだけで紐付きを管理できる

schema.rb
create_table "active_storage_attachments", force: :cascade do |t|
    :
    t.index ["record_type", "record_id", "name", "blob_id"], name: 
    :
  end

上記のカラムの内容 ↓

  • record_type
    モデル名
  • record_id
    モデルの対象レコードのid
  • name
    モデルで指定した名称
  • blob_id
    active_storage_blobs のレコードのid

感想

ActiveStorageは、「画像投稿するときに必要なやつ」くらいの認識しかなかったですが、ER図作成時に誤ってエンティティに写真を追加してしまったときに「そういえばなんでカラム追加しないんだっけ?」と思ったのがきっかけでした。まだまだ理解の足りない初学者ですが少しづつ深堀できるようにしていきたいです。

参考

https://toshpit.com/rails-activestorage/
https://vermuda.jp/blog/2345#:~:text=Active Storageはその画像,持たせる必要があります。

Discussion