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
以上で無事、モデルもテーブルも削除する事が出来ました。
この記事が気に入ったらサポートをしてみませんか?