🗑️

【Rails】Active Storage のテーブルを削除する

2022/03/14に公開

先日 Rails で画像投稿機能を実装するのに CarrierWave を使用しました。
ですが私の場合、CarrierWave を導入する前に一度 Active Storage での画像投稿機能を実装しかけており、後から CarrierWave に乗り換えた形でした。

そこで不要となった Active Storage のテーブルを削除することに。
以下の記事を参考に削除作業を進めました。

画像管理をActiveStorageからCarrierWaveへ乗り換えた話 - dely tech blog

こちらの記事では Active Storage 用に生成されたテーブルを削除するためのマイグレーションファイルとして以下のようなコードを紹介しています。

2022XXXXXXXXXX_destroy_active_storage_tables.rb
class DestroyActiveStorageTables < ActiveRecord::Migration
  drop_table :active_storage_blobs
  drop_table :active_storage_attachments
end

自身のマイグレーションファイルも同じように編集してマイグレーションコマンドを実行しました。
しかし、ここでエラーが発生。

ERROR: cannot drop table active_storage_blobs because other objects depend on it

↑「active_storage_blobsテーブルが他のオブジェクトに依存しているから削除できないよ」と怒られてしまいました。何に依存しているのか dbconsole で確認してみます。

見たところ Active Storage のセットアップ時に生成されたテーブルが3種類あります。

  • active_storage_attachments
  • active_storage_blobs
  • active_storage_variant_records

以上の3つですね。active_storage_blobsは他2つに外部キー制約が設定されているのでしょう。
ここでactive_storage_blobsより先にactive_storage_attachmentsactive_storage_variant_recordsを削除するように指定すればうまくいくだろうと見当をつけます。

ということで修正したマイグレーションファイルがこちら。

2022XXXXXXXXXX_destroy_active_storage_tables.rb
class DestroyActiveStorageTables < ActiveRecord::Migration[6.1]
  def change
    drop_table :active_storage_attachments
    drop_table :active_storage_variant_records
    drop_table :active_storage_blobs
  end
end

active_storage_blobsが一番最後に削除されるように書き直しています。

こちらのコードに修正してからマイグレーションを実行。無事 Active Storage のテーブルをきれいさっぱり削除することができました。

ちなみにactive_storage_variant_recordsは何のテーブルかというと、投稿された画像(オリジナル)の加工バージョン(リサイズなどした別画像)を保存するためのテーブルとのことです。

Active Storage の概要 - Railsガイド

Discussion