【Ruby on Rails】 削除コマンドまとめ
1. はじめに
アプリの作り始めに、「なんか気に入らないから1回削除して一から作り直したい」と思ったことはありませんか?そんな時に必要になる操作をまとめました。
環境
ruby 2.5.7
Rails 5.2.4
macOS Catalina 10.15.6
2. アプリの削除
アプリの削除をするにはアプリのフォルダを削除すればいいのですが、その前にデータベースを削除しておきましょう。
同じ名前でアプリを作り直したりしたときに以前のデータベースを利用してしまい、不具合が起きる可能性があります。
アプリケーションフォルダ内で、
$ rails db:drop
これでデータベースが削除されます。
そのあとは、以下コマンドでアプリフォルダを削除してもいいですし、ゴミ箱へと放り込んでもいいでしょう。
$ cd .. (1つ上のフォルダへ)
$ rm -rf [アプリ名]
ちなみに上記削除コマンドの意味は、
rm = 削除するというコマンド
-rf = ファイルでなくフォルダを削除するよという -r と削除官僚のメッセージ表示はいらないよという -f の組み合わせ
先にアプリを削除してしまった場合
データベースのみが残り、アプリがないためデータベースの削除ができません。
コンソールからsqlite3やmysqlに直接ログインし、データベースを消去しましょう。
「sqlite3 ログイン」や「mysql データベース 削除」などで調べてみてください。
もしくは、ちょっと裏技っぽいのですが、まったく同じ名前のアプリをrails newしてからrails db:dropしてもいいです。(アプリの名前とデータベースの名前が一致しているため。)
3. コントローラの削除
アプリケーションフォルダ内で以下のコマンドを実行します。
作成の際のrails generateはrails gと省略できますが、destroyは出来ません。
ルーティングは自分でconfig/routes.rbをいじって消しましょう。
$ rails destroy controller [削除したいコントローラ名]
4. モデルの削除
マイグレーションを実行する前か後かで操作が変わるので注意。マイグレーション実行というのは、言い換えればデータベースにテーブルを作ること、もしくはrails db:migrateを実行することです。わからなかったら実行後の操作をしてみてください。
マイグレーション実行前
アプリケーションフォルダ内で以下のコマンドを実行します。
作成の際のrails generateはrails gと省略できますが、destroyは出来ません。
$ rails destroy model [削除したいモデル名]
マイグレーション実行後
まずはマイグレーションまでしてみましょう。以下コマンドを実行。
説明の都合上、2つのモデルを作ってマイグレーションします。(なんの情報も持っていないモデルだけど気にしない。本当はカラム名:データ型を後ろにつけます)
$ rails g model user ← モデル作成
$ rails db:create ← データベース作成(まだデータベースを作っていない場合)
$ rails db:migrate ← テーブル作成
$ rails g model post
$ rails db:migrate (ここでやるから先の rails db:migrate はやらなくてもいい)
モデルを削除する際には、データベースにテーブルが作成されてしまっているのでそちらを削除してからモデルを削除する必要があります。
まずは以下コマンドを実行してみましょう。
$ rails db:migrate:status
マイグレーションを実行した一覧が出てきます。これが
Status Migration ID Migration Name
--------------------------------------------------
up 20200318134652 Create users
up 20200318134702 Create posts
Statusがupになっているということはこのマイグレーションが実行されている(テーブルが
作られている)ということ。
以下コマンドのどれかを実行して、削除したいモデルのマイグレーションを取り消しましょう。
$ rails db:rollback (1つだけ前の状態に戻す)
$ rails db:rollback STEP=2 (2つ前の状態に戻す)
$ rails db rollback VERSION=20200318134652
(Migration ID:20200318134652のマイグレーションまで実行された状態に戻す)
マイグレーションが2つくらいならrails db:rollbackを2回やればいいですが、たくさん戻したいならステップ数やバージョンを指定すると楽ですね。(不整合が起きるため、過去の特定のマイグレーションだけを取り消すことはできません。)
これで実行したマイグレーションが取り消されたので、あとはマイグレーション実行前と同様にrails destroy [モデル名]で削除しましょう。
マイグレーション取り消しの前にモデルを削除してしまった場合
せっかちで先にrails destroy [モデル名]を実行してしまった人のため。
例えば先の例でpostモデルを削除してしまったとします。するとpostのマイグレーションファイルも削除されてしまいrails db:rollbackでマイグレーションを取り消すことすらできなくなります。(絶望)
その場合は、まず以下コマンドで新しくマイグレーションファイルを作成します。
$ rails g migration [マイグレーション名]
マイグレーション名はなんでもいいですが、わかりやすくdrop_postとでもしておきましょう。
するとdb/migrate/内に以下ファイルが作成されます。
20200318143822_drop_post.rb
class DropPost < ActiveRecord::Migration[6.0]
def change
end
end
changeメソッド内に以下の様に追記しましょう。
20200318143822_drop_post.rb
class DropPost < ActiveRecord::Migration[6.0]
def change
drop_table :post
end
end
そしてマイグレーションを実行します。するとpostテーブルが削除されているため一件落着。
$ rails db:migrate
無駄なマイグレーションファイルが残ってしまうのが自分的に嫌です。ファイルを削除しても基本問題ありませんがrails db:migrate:statusで表示される履歴の中にはしっかり残っています。(※マイグレーションファイルは削除しちゃだめです。)
Status Migration ID Migration Name
--------------------------------------------------
up 20200318145751 Create users
up 20200318150431 ********** NO FILE **********
up 20200318150544 ********** NO FILE **********
5. scaffoldで作成したモデルやコントローラ等の削除
rails g scaffold [モデル名] カラム名:データ型 (カラム名:データ型...)でモデルやコントローラやルーティングなどを一括作成してくれます。詳しくは別記事を参照してください。
rails g scaffoldで作成したんだからもちろん削除は以下コマンド。全部スッキリ削除してくれます。
rails destroy scaffold [モデル名]
6. データベース内のデータを削除
モデルやコントローラ、ビューなどを作成し、色々試していているとデータベース内のデータがごちゃってきて初期状態に戻したい時があると思います。そういうときは以下コマンドを実施。
rails db:reset
今あるデータベースを削除して新しくもう一度作ってくれます。db/seeds.rbを使って初期データ投入を行っている場合は初期データ投入も同時にやってくれるので、自分でrails db:seedを行うと二重にデータが入ってしまいます。
以上です。今後もアップデート予定です。