はじめに
テーブル関係を削除してスッキリさせようと思ったところ、関連付けのおかげで少し手間取ったので記事にまとめます。
目次
テーブルを削除する
テーブルを削除するときの手順として私は以下のように行います。
① モデル削除
rails destroy model モデル名
② 削除用のマイグレーションファイルを作成
rails generate migration 自分でつけるmigrationファイルの名前
③ drop_tableで削除したいテーブル名を書く
作成したmigrationファイルに記載
class 自分で作成したファイルの名前が入る < ActiveRecord::Migration[6.0]
def change
drop_table :hoges # hogesテーブルを削除する場合
end
end
④ migrateを実行して削除
rails db:migratre
依存関係がある場合
いつもなら最初の方法で問題がないはずなのですが、依存関係がある場合だと下記のようなエラーが出ます。
DROP TABLE products;
NOTICE: constraint orders_product_no_fkey on table orders depends on table products
ERROR: cannot drop table products because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
公式サイトによると
データベース構造全体の整合性を保つため、PostgreSQLは、他のオブジェクトと依存関係にあるオブジェクトの削除を許可しません。 例えば、項5.3.5で作成したproductsテーブルを削除しようとしても、ordersテーブルがこのテーブルに依存しているので、以下のようなエラーメッセージが現れます。
つまり関連付けを行なっているためdrop_tableを実行できないという事ですね。
その後の文章では次のように続きます。
エラーメッセージには役に立つヒントが含まれています。 以下のようにすると、依存する全てのオブジェクトを1つずつ削除する手間を省けます。
DROP TABLE products CASCADE;
これで全ての依存オブジェクトが削除されます。 この場合、ordersテーブルは削除されずに外部キー制約のみが削除されます。
なるほど! DROP TABLE products CASCADE;
を使用すればいいか!早速やってみよう!
依存関係がある場合のテーブルを削除してみる
Railsではrails db
または rails dbconsole
でSQLを操作できるようになるので早速やってみます。パスワードを求められるので自身で設定したパスワードで入ってください
① rails db
を実行
② DROP TABLE 削除したテーブル名 CASCADE;
を実行
以上でなんとか削除できました!よかった!