アラフォーがお金持ちになるためプログラマ目指すブログ

お金も根性も学歴もないアラフォーまきのがエンジニア…じゃない、プログラマになってお金持ち目指すよ!

侍エンジニア塾 休学なう4

どうも、アラフォーまきのです。
もう金曜日!?早すぎない!?



今日まで何してた?

とりあえず、細々したレイアウトや、利用規約など、じみちにチクチクやってました。






この間まで詰まっていた、謎のエラーもなんとか解消できたんだけれど…根本的な解決になってないと思うんだよなあ。




困ってたエラー


全部で6つあるモデルのうち、worksテーブルとdo_mokusというテーブルの紐付けのところでエラーが出てた。




そもそもそのエラーが出てるモデルさんたちの関係はこんな感じ





【work】 belongs_to: do_moku
【do_moku】has_many: works






do_mokuはたくさんのworkを持ってる。
workはdo_mokuに属する。





プロトタイプの時は、do_mokuはmokuという名前だった。
それ以外に違いはないはず…なんだけれど…。





どういうわけかバリデーションエラーが出るんですよ。
プロトタイプで出なかったのに。





バリデーションエラーでは「Do mokuを入力してよ」と出てる。




work.rbに書いてるバリデーションに嘘がないか確認したり、
schema.rb確認して変な制約つけちゃってないか確認したり、
rails cでvalid?を試してみたりとか、
rails cでcreateを試してみたりとか、
とにかく調べられそうなことは調べてたんです。






で、先週ブログあげた後にさらに調べて、

belongs_to :do_moku, optional: true

ってしてバリデーションから外れるようにしたらとりあえず動きはしたんですよ。




でも、それおかしいでしょ。




だってこのoptional: trueって、「紐付けしているモデルの外部キーがnilでもいいからレコード作って」って無理やりやってるわけだよね?




「紐付けしているモデルの外部キーがnilだからエラー」な訳で、それ自体おかしい話な訳だもん。
出力された情報見ると、ちゃんとmoku_id:20とか、worksからみた外部キーのdo_mokuのid拾えてるんだもん。






で、たった今この記事書いてる時に「あぁ!?そういうことか!?」と気づいたことが。




worksテーブルでのdo_mokusのid





これってworksから見れば外部キーになるわけだけど、これのカラム名を何も考えずに、プロトタイプと同じmoku_idとしていたんだ。




でもさ、テーブルdo_mokusって名前にしたんだよ。
ってことは、外部キーの入るカラム名がmoku_idじゃあだめじゃない?
do_moku_idっていうカラム名にしてあげないとダメなんじゃない?




で、早速実験したんですよ。
え?調べろ?ホントだよwでももう実験しちゃったw



rails g migration rename_moku_id_column_to_do_moku_id

ってしてマイグレーションファイル作って



class RenameMokuIdColumnToDoMokuId < ActiveRecord::Migration[5.2]
  def change
    rename_column :works, :moku_id, :do_moku_id
  end
end

って書いて保存して


rails db:migrate


ってして、いままでwork.moku_idって書いてた部分を全てwork.do_moku_idに書き換えて






【work.rb】

belongs_to :do_moku, optional: true



【work.rb】

belongs_to :do_moku


にもどして、いざworkをcreateしたら…できた!




カラム名の命名がアホだったんやー!!!





Active Recordさんの頭の良さに、まきのはついていけてなかった…ッ!






というか、多分超基本的なことなんだと思うんだけれど、理解できてなかったんだなあ Railsさんのすごいところ。




すごすぎないですか!?
紐付けしていれば、カラム名に【テーブル名_id】としてあげるだけで、そのテーブルのプライマリキーを外部キーとして認識してくれるなんて!







Railsガイドの「2.2 スキーマの規約」にもめっちゃ書いてあるね。
railsguides.jp









こんなことで一体何日無駄にしたんだろう…。
たった今、解決できました、多分。





正直いって超恥ずかしい。
でも、これ絶対忘れないねw
これだけ恥ずかしいと思ったらねw





いやでも、もしこれまだ「間違ってんよ!」ということであれば、ぜひご指摘・御指南願います!
心してかかります!





やー、こんなんじゃまだまだ役に立たないな…。
もっと頑張らねば!




さあもう3月も終わりが見えてきたよ!
ラストスパート!!



もっと頑張れ!(号泣)