SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール

Railsアプリケーションにファイルを簡単にアップロードするgem「Shrine」と「ActiveStorage」

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール 第10回

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構文が定義されています。各テーブルのカラムの役割については後ほど解説します。

[リスト 8]db/migrate/20181219111032_create_active_storage_tables.active_storage.rb
# 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

 生成された、テーブルごとのカラムの用途は以下の通りです。

表:active_storage_blobsテーブルのカラム用途
カラム名 用途
id プライマリーキー
key ファイル固有のキー
filename アップロード時のファイル名
content_type アップロードされたファイルのContent-Type
byte_size アップロード時のファイルサイズ
checksum ファイルのチェックサム
created_at ファイルの作成日時
表:active_storage_attachmentsテーブルのカラム用途
カラム名 用途 
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が生成されます。設定ファイルを確認します。

[リスト 9]config/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が定義されています。

[リスト 10]config/environments/development.rb
…(中略)…
  # 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ディレクティブの値を使います。

次のページ
ActiveStorageの導入(2)

この記事は参考になりましたか?

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11339 2019/02/05 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー