###テーマ「データベース 頭文字は大文字か小文字か」
この投稿はRailsのデータべース作成に関する記事です。
データベース周辺は間違えると後のアプリ開発に悪い影響を与えてしまいます。
このミスを参考にみなさんは出来る限りデータベース周辺では間違わないようにしてください!
###今回の主犯
外部キーの頭文字を大文字にしてしまったため、seed.rbからデータを入力できなくなった。
実物はこちらです。Faculity_id←これ。。。本来はfaculity_idとなるべきはず
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
###ミスの原因
1ヶ月ぶりにRailsを触り、フレームワークの使い方を忘れてしまったこと
(初心者は毎日触らなけれぼなりませんね。思い知りました😢)
###ターミナルで入力した間違いのコマンド
referencesの前を大文字にしてしまったため、外部キーも大文字になった。
$ rails g migration AddFaculityToMajors Faculity:references
本来は$ rails g migration Add(頭文字大カラム名)To(頭文字大テーブル名) (小文字カラム名):references
というコマンドの構成です。(下記のコマンドが正しい)
$ rails g migration AddFaculityToMajors faculity:references
###seed.rbからデータを入力すると。。。
seed.rbからデータが送れない。外部キーが合わないため当然ちゃ当然ですね。
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
こちらは小文字なので、キーが探せずrollbackされてしまった。
Major.create!(id: 1, name: '経営', faculity_id: 1)
###ここでもう1つ問題が。。。Faculity_id(主犯)が消えない
Faculity_idの外部キーを削除するために、削除コマンドを試したが、、、
$ rails g migration RemoveFaculity_idFromMajor faculity:references
Running via Spring preloader in process 8806
invoke active_record
create db/migrate/20200207160003_remove_faculity_id_from_major.rb
$ rails db:migrate
== 20200207160003 RemoveFaculityIdFromMajor: migrating ========================
-- remove_reference(:majors, :faculity, {:foreign_key=>true})
-> 0.0078s
== 20200207160003 RemoveFaculityIdFromMajor: migrated (0.0083s) ===============
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
依然として、Faculity_idがある。なぜーーーーー(ぴえーん)
###もうこれはテーブル丸ごと消してしまおう!!!!!(テーブル削除に初挑戦)
削除コマンドはこちらを参考にしました。
[Rails]不要になったmodelの削除方法(https://bokuranotameno.com/post-9880/)
$ rails g migration drop_table_(テーブル名複数形)
migrationファイルに削除するテーブル名を記述し$ rails db:migrateを実行します。
def change
drop_table :majors(テーブル名複数形)
end
一連のコマンドの流れ
$ rails g migration drop_table_majors
Running via Spring preloader in process 9120
invoke active_record
create db/migrate/20200207160634_drop_table_majors.rb
$ rails db:migrate
== 20200207160634 DropTableMajors: migrating ==============================
== 20200207160634 DropTableMajors: migrating ==================================
-- drop_table(:majors)
-> 0.0020s
これでようやくFaculity_idは削除されました!!!(テーブルごと消えてしまったけど(笑))
modelの関連ファイルも削除します。
・modelファイルの削除 app/models/major.rb
・testファイルの削除 test/models/major_test.rb
・fixturesファイルの削除 test/fixtures/majors.yml
###新しいmodelを作成しよう!だがまた新たな問題が、、、
$ rails g model Major name:string faculity:references
Running via Spring preloader in process 9606
invoke active_record
conflict db/migrate/20200207161950_create_majors.rb
Another migration is already named create_majors: /home/ec2-user/environment/review/db/migrate/20200207072743_create_majors.rb. Use --force to replace this migration or --skip to ignore conflicted file.
どうやらmigrateフォルダ内にある前回Major modelを作成したmigrationファイルが残っていることが原因
migrateフォルダからmigrationファイルを削除すると、herokuにアップした時などデータベースが上手く作られない可能性があるが、新しくmodelを作成するので大丈夫だと信じる
###migrationファイル削除後、もう一度試す!!!
$ rails g model Major name:string faculity:references
Running via Spring preloader in process 10134
invoke active_record
create db/migrate/20200207162947_create_majors.rb
create app/models/major.rb
invoke test_unit
create test/models/major_test.rb
create test/fixtures/majors.yml
$ rails db:migrate
== 20200207162947 CreateMajors: migrating =====================================
-- create_table(:majors)
-> 0.0034s
== 20200207162947 CreateMajors: migrated (0.0040s) ============================
無事できた!!!
###seedファイルも大丈夫かどうか確かめる。
$ rails db:seed
こちらも無事エラーが出ない!!!!!
###(教訓)データベースを作成する時大文字小文字に注意
モデルの作成は大文字
$ rails g model User(大文字)
カラムの作成は小文字
$ rails g migration AddPostToUser user:references(小文字)
皆さんも、これらの項目に注意をして、楽しくアプリ開発してください!!!
これが参考にされば幸いです!