Active Storageって何。
Active Storageとは
データベース上で使われる2つのテーブルのこと。
Active Storageを使うことで、モデルに画像データを紐づけることが可能になる。
今のところ、Amazon S3、Google 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 S3、Microsoft 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の代用として使えるか考える
ActiveRecord トランザクションと ActiveStorage をちょっとだけ仲良くさせる方法 - SmartHR Tech Blog