LoginSignup
1
0

More than 3 years have passed since last update.

外部キー作成の時の注意事項

Posted at
1 / 2

テーマ「データベース 頭文字は大文字か小文字か」

この投稿はRailsのデータべース作成に関する記事です。
データベース周辺は間違えると後のアプリ開発に悪い影響を与えてしまいます。
このミスを参考にみなさんは出来る限りデータベース周辺では間違わないようにしてください!

今回の主犯

外部キーの頭文字を大文字にしてしまったため、seed.rbからデータを入力できなくなった。
実物はこちらです。Faculity_id←これ。。。本来はfaculity_idとなるべきはず

scheme.rb

 create_table "majors", force: :cascade do |t|
    t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
  end

ミスの原因

1ヶ月ぶりにRailsを触り、フレームワークの使い方を忘れてしまったこと:sob:
(初心者は毎日触らなけれぼなりませんね。思い知りました😢)

ターミナルで入力した間違いのコマンド

referencesの前を大文字にしてしまったため、外部キーも大文字になった。

terminal.
$ rails g migration AddFaculityToMajors Faculity:references

本来は$ rails g migration Add(頭文字大カラム名)To(頭文字大テーブル名) (小文字カラム名):references
というコマンドの構成です。(下記のコマンドが正しい)

terminal.
$ rails g migration AddFaculityToMajors faculity:references

seed.rbからデータを入力すると。。。

seed.rbからデータが送れない。外部キーが合わないため当然ちゃ当然ですね。

scheme.rb

 create_table "majors", force: :cascade do |t|
    t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
  end

こちらは小文字なので、キーが探せずrollbackされてしまった。

seed.rb
Major.create!(id: 1, name: '経営', faculity_id: 1)

ここでもう1つ問題が。。。Faculity_id(主犯)が消えない:cry:

Faculity_idの外部キーを削除するために、削除コマンドを試したが、、、

terminal.
$ 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) ===============
scheme.rb

 create_table "majors", force: :cascade do |t|
    t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
  end

依然として、Faculity_idがある。なぜーーーーー:sob:(ぴえーん)

もうこれはテーブル丸ごと消してしまおう!!!!!(テーブル削除に初挑戦)

削除コマンドはこちらを参考にしました。
[Rails]不要になったmodelの削除方法(https://bokuranotameno.com/post-9880/)

terminal.
$ rails g migration drop_table_(テーブル名複数形)

migrationファイルに削除するテーブル名を記述し$ rails db:migrateを実行します。

20200207073446_○○_majors.rb
def change
    drop_table :majors(テーブル名複数形)
end

一連のコマンドの流れ

terminal.
$ 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を作成しよう!だがまた新たな問題が、、、

terminal.
$ 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を作成するので大丈夫だと信じる:angel:

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ファイルも大丈夫かどうか確かめる。

terminal.
$ rails db:seed

こちらも無事エラーが出ない!!!!!

(教訓)データベースを作成する時大文字小文字に注意

モデルの作成は大文字

terminal.
$ rails g model User(大文字)

カラムの作成は小文字

terminal.
$ rails g migration AddPostToUser user:references(小文字)

皆さんも、これらの項目に注意をして、楽しくアプリ開発してください!!!
これが参考にされば幸いです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0