ぺろのなるほどブログ

ぺろがなるほどした話を書きます

【Railsモデル作成】マイグレーションと外部キーで失敗した話

 

こんにちわ、ぺろです。

 

今日はモデル作成の時に、

マイグレーションと外部キーの設定で失敗した時の話をします。

 

モデルを作る上で、お約束がいっぱいありますよね??

その中で、今回私が声を大にして皆さんにリマインドしておきたいのがこちら

  1. モデル作る時も、親モデルから子モデルの順にマイグレイト せなあかん〜!
  2. マイグレーションファイルは、1回しか読み込まれへんで〜!
  3. マイグレーションファイル自体を消したらあかんで〜!

諸先輩方には、当たり前の話やと思います。

しかしこの新米ぺろはやってしまいました、これ全部。 

 

 

1. モデル作る時も、親モデルから子モデルの順にマイグレイト せなあかん〜!

 

失敗:

アプリ制作の要であるデータベース設計をやっと終えると、

思ったよりも大量のモデルが出来上がりました。

これはrails g modelのしがいがあるで〜〜〜〜〜

鼻息も荒く腕まくりしながら端からじゃんじゃんモデルを作りまくって行きました。 

モデルのマイグレートファイルを作成して必要事項を記入し、

全てのファイルを一気にマイグレート!!。。。

するとどうでしょう、モデル作成後の作業でforeign_keyなんかないで〜!のエラーが続出。

 

解決方法:

今回理解しておかないと行けなかったのは、

■モデルにも、ちゃんと親モデル子モデルの関係がある、ということ。

あともう一つ、

■外部キーは関係のあるモデル間、つまりbelongs_toする先のモデルがないと設定できないということ。

一気にマイグレートしてしまったおこめは、belongs_to先のモデルが揃ってなかったので外部キー設定出来ていなかったのです。

 

つまり、親モデルから順番に作っていき、必要モデルが揃ったところでforeign_keyの設定をマイグレイト しないといけなかったんですねなるほどな〜。

 

 

2. マイグレーションファイルは、1回しか読み込まれへんで〜!

 

失敗:

じゃあなぜ最初のマイグレーションの時にエラーが出て気づかなかったのかというと、

外部キー設定の記述を忘れていたんですね。

一気にマイグレーションした後にそのことに気づいて、

そのままのファイルに記述をし再度マイグレート!。。。

そうです、この時に2つ目のミスを犯していました。

一度読み込まれたマイグレーションファイルは、2度目はスルーされる、つまり読み込まれないんですよね。。。スルーされてるんやからそりゃエラーは出ないですわ。

そのことをすっかり失念していた私は、

これで外部キー設定が出来たと思い込んでいました。

 

解決方法:

マイグレーションファイルは1度読まれたファイルはもう使えない。

■モデルに何か変更を加える時(カラムを追加する等)は必ずそれ用のマイグレーションファイルを作り直す。

当たり前ですね!すみません!

 

3. マイグレーションファイル自体を消したらあかんで〜!

 

失敗:

邪魔やったから物理的に消しちゃったんですよね〜!

カッなってつい。

するとロールバックもマイグレートも出来なくなってしまいました。

 

解決方法:

Schemaファイルと辻褄が合わなくなってしまいます。

マイグレーションファイルは物理的に削除せず、ちゃんとエラーを読みましょう。(はい)

■ターミナル内rake db migrale:statusでマイグレーションのステータスを確認。

No file : UP というステータスの記述が、物理的にファイルを削除してしまったマイグレーションのステータス。これをdownにして削除しなければ前に進めない。

vim db/migrate/(migration_file_id)_tmp.rbのコマンドを使用

消してしまったファイルをTmpファイルとして復活させる。

 

Tmpファイル内の記述:

 

>|ruby|

 class Tmp < Active Record::Migration

      def change

      end

    end

||<

 

※Tmpファイルは1度に2つは作れないので、1つずつ作業する。

■ bundle exec db:migrate:down VERSION=ファイルのidのコマンドを使用

ステータスをupからdownへ

■rm-rf db/migrate/ファイルのid_tmp.rbのコマンドを使用

tmpファイルを削除

 

 

 

〜無事migrate出来ました!〜

参考記事:https://qiita.com/yukofeb/items/ce39c7aabbfdc16205ea

(ありがたや)

 

 

BDをめちゃくちゃにいじってしまいましたが。。。

とてもいい勉強になりました。

失敗は勉強の素。

 

 

ぺろでした。