【Rails】Active Storage のテーブルを削除する
先日 Rails で画像投稿機能を実装するのに CarrierWave を使用しました。
ですが私の場合、CarrierWave を導入する前に一度 Active Storage での画像投稿機能を実装しかけており、後から CarrierWave に乗り換えた形でした。
そこで不要となった Active Storage のテーブルを削除することに。
以下の記事を参考に削除作業を進めました。
画像管理をActiveStorageからCarrierWaveへ乗り換えた話 - dely tech blog
こちらの記事では Active Storage 用に生成されたテーブルを削除するためのマイグレーションファイルとして以下のようなコードを紹介しています。
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_attachments
とactive_storage_variant_records
を削除するように指定すればうまくいくだろうと見当をつけます。
ということで修正したマイグレーションファイルがこちら。
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
は何のテーブルかというと、投稿された画像(オリジナル)の加工バージョン(リサイズなどした別画像)を保存するためのテーブルとのことです。
Discussion