[Rails]不要になったmodelの削除方法
2020/07/20
よくある間違い
不要になったUserモデルを削除したいと思った時に
$ rails destroy model users
としてしまうのは最初やってしまいがちな間違い。
「一発で関連ファイルを全部消せて楽じゃん」と思ってしまいますが、実は悪手。
このコマンドを実行した時の中身を見ればわかりますが
invoke active_record remove db/migrate/2017XXXXXXXXX_create_users.rb remove app/models/user.rb invoke test_unit remove test/models/user_test.rb remove test/fixtures/users.yml
このようにモデルを作成した時のmigrationファイルを直接消してしまっています。
少しDBをいじったことがある方はもうお分かりだと思いますがmigrationファイル自体を消すのは基本御法度。DBの整合性がとれなくなってあらゆるところでエラーが出がち。ダメ、絶対。
仮に上手くいっても該当モデルのテーブルを削除するmigrationファイルを作成してくれるわけでもないので、migration済みのテーブルは変わらず残ったまま。使っていたモデルを(アプリとDB両方から)削除するという目的を達成できません。
※ちなみにcontrollerの方はrails destory controller users……みたいな形で一括削除してしまっても特に問題なし。
正しい手順
1.不要テーブルの削除migrationファイルの作成
対象テーブルを削除するmigrationファイルを作成しましょう。
例)Userモデル(usersテーブル)を削除する場合
$ rails generate migration drop_table_users
としてmigraitonファイルを作成し、該当ファイルのdef change部分に
def change drop_table :users do |t| t.string :name, null: false t.timestamps null: false end end
と追記。
※ブロック変数の部分は、そのテーブルのその時点のカラムの内容を書く。(これがないとrollbackできない)
面倒だったら、
def change drop_table :users end
というのも有り。(rollbackできなくなるから本当は無しだけど)
2.migrationの実行
$ rails db:migrate
として、今作ったテーブル削除のmigrationファイルを実行しましょう。
3.関連ファイルの削除
以下の関連ファイルを手動でDeleteしましょう。
例)Userモデルを削除する場合
modelファイルの削除
app/models/user.rb
testファイルの削除
test/models/user_test.rb
fixturesファイルの削除
test/fixtures/users.yml
これで不要になったモデル、関連ファイルの削除は完了です。
ちょっと面倒ですけど頑張りましょう。次のRailsのアップデートで全部よしなにやってくれる機能が実装されることを祈ります