Active Storageって何。

Active Storageとは

データベース上で使われる2つのテーブルのこと。

Active Storageを使うことで、モデルに画像データを紐づけることが可能になる。

今のところ、Amazon S3Google Cloud Storage、Microsoft Azure Storage のクラウドストレージが標準で対応されている。

Active Storageは、rails5.2以降標準ファイルとして搭載されている。

5.1以前はcarrierwaveやrefile,shrineといったgemを使って画像ファイルのアップロード機能をつけていたそう。

具体的に、Active Storageは以下の テーブルを内蔵している。

//BlobsTable
active_storage_blobs 

//AttachmentsTable
active_storage_attachments

active_storage_blob

画像以外の、識別キーや、ファイル名、サイズや、ファイルのメタデータが管理されているテーブル。

active_storage_attachment

モデルのインスタンスと[active_storage_blobs]テーブルとを結びつけるための中間テーブル。[active_storage_blobs]とポリモーフィックに結合させている。

使用方法

アプリを新規した後は以下のコマンドを実行することでActive Storageが使えるようになる。

$ bin/rails active_storage:install

$ bin/rails db:migrate

has_one_attached

has_one_attachedマクロは、レコードとファイルの間に1対1の関係を設定している

たとえば、アプリケーションにUserモデルあるとして、各userにavatarを持たせたい場合は、以下のようにUserモデルを定義する。

class User < ApplicationRecord
  has_one_attached :avatar
end

viewで以下のように書くことで、avatarを呼び出すことが可能になる

<%= form.file_field :avatar %>

has_many_attached

has_many_attachedマクロは、レコードとファイルの間に1対多の関係を設定している。

そして各レコードには、多数の添付ファイルをアタッチできる。

たとえば、アプリケーションにMessageモデルがあるとする。次のようなMessageモデルを定義しますことで、メッセージごとに多数の画像を持たせることができる。

class Message < ApplicationRecord
  has_many_attached :images
end

以下のように書くことで、画像付きのメッセージを作成できる。

class MessagesController < ApplicationController
  def create
    message = Message.create!(message_params)
    redirect_to message
  end

    private

  def message_params
    params.require(:message).permit(:title, :content, images: [])
  end
end

images.attachを呼び出すと、既存のメッセージに新しい画像を追加できる。

@message.**images**.**attach**(params[:images])

Active Storageと Carrierwaveの比較

引用文献

CarrierWave

ActiveStorage同様、「Google Cloud Storage、Amazon S3Microsoft Azure Storage」などのクラウドストレージ対応gemのfogと連携させることでファイルのアップロードが可能になる。具ダウンロードするには、下記項目が必要になる。

・Gemfileへの追記・画像保存用のカラムを追加するためのマイグレーションファイルの生成 ・マイグレーションの実行・アップローダー用のモデルの作成 ・モデルとアップローダーとの紐づけ ・config/initializers/carrierwave.rb を作成し、クラウド用の各種設定

Active Storage

設定の際にやるべきことは下記の通り。

・Gemfileへの追記 ・rails active_storage:installコマンドとマイグレーションの実行によるblobテーブルとattachmentテーブルのそれぞれの作成 ・config/storage.yml ファイルにおけるクラウド用の各種設定 ・各種環境設定ファイル「configフォルダの中」へのconfig.active_storage.service変数の設定

ActiveStorage::Variant < Object

Image Blobがもつ画像を好きな大きさに変換してくれるメソッド。

gem "image_processing"をGemfileに記述することで利用可能になる。

processed

すでにavatarの画像の大きさがリサイズされていたら、そのままレスポンスを返し、リサイズされていなかったらvariantの中身に沿って画像をリサイズするメソッド。

avatar.variant(resize_to_limit: [100, 100]).processed.url

Rails way なファイルアップローダActiveStorageを調べてみた - stmn tech blog

ActiveStorageがCarrierWaveの代用として使えるか考える

Active Storage の概要 - Railsガイド

Active Storageを使って画像をアップしよう!

ActiveRecord トランザクションと ActiveStorage をちょっとだけ仲良くさせる方法 - SmartHR Tech Blog

【Active Storage】ファイルアップロード時のバリデーション設定 - Qiita

ActiveStorage::Variant