Railsに「テーブルを消せ!」と怒られました…

■前提

・作成したモデル名:user

・作成したテーブル名:users

(ちなみに、この時既にログイン機能を実装するためにdeviseというGemをインストール済みでした。ですので、これ以降「rails devise user」のようにdeviseと書かれている箇所に違和感を感じて「ん?そこはmodelじゃないの?」と思われる方もいるかもしれませんが、基本的に「rails model user」と置き換えても結果は変わらないのであまりdevise表記は気にしないでください。)


■経緯

「rails g devise user」でuserモデルを作成し、「rake db:migrate」をしたらエラーが発生した。


■エラー文

----------------------------------------------------------------------------------------------------------

rake aborted!

StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(255) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0 NOT NULL, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB

/Users/■■■/▲▲▲/●●●/db/migrate/20161110053932_devise_create_users.rb:3:in `change'

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(255) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0 NOT NULL, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB

/Users/■■■/▲▲▲/●●●/db/migrate/20161110053932_devise_create_users.rb:3:in `change'

Mysql2::Error: Table 'users' already exists

/Users/■■■/▲▲▲/●●●/db/migrate/20161110053932_devise_create_users.rb:3:in `change'

Tasks: TOP => db:migrate

(See full trace by running task with --trace)

----------------------------------------------------------------------------------------------------------

英語は全く出来ませんが、どうやら「usersテーブルは既にあるぞ」と言われているようです…


■解決策

①まずモデルを削除する

$ rails destroy devise user

②次にテーブルを削除するために、削除用のmigrationファイルを作成する

$ rails generate migration drop_table_users(←ここは任意のファイル名で可)

③作成したmigrationファイルにテーブル削除を記述する

(2016××××××××××_drop_table_users.rb)

class DropTableUsers < ActiveRecord::Migration
 def change
  drop_table :users
 end
end

④マイグレーション実行

$ bundle exec rake db:migrate


以上で無事、モデルもテーブルも削除する事が出来ました。

この記事が気に入ったらサポートをしてみませんか?