ぼくらの研究

ぼくらのための研究をしていきます。

[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のアップデートで全部よしなにやってくれる機能が実装されることを祈ります