ゲーム、は楽しい。
そりゃそうですよね。ゲームは楽しいものです。昨日は誘惑に負けてしまい3時間ぐらいスマホゲームしてしまった。TEPPENっていうCAPCOMとガンホーの共作のやつ。CAPCOMのいろんなキャラが出てて面白そう〜っていう誘惑に負けた。おかげさまで昨日と今日でFランクからCランクまであがりました。考えるから頭の回転も速くなるしいい休憩になった!(前向き)
1.簡単日記
そんなこんなで誘惑に負けてしまいましたが今日はちゃんと勉強しましたよ。ゲームをするのは移動中の片道30分だけ!笑
2.今日の学び
◆#rails 中間テーブルに保存する際の注意点
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
例えばuserとprojectが多対多の関係にありstaffsという中間テーブルがあるとする。new projectを保存する際にuserを選択して保存すると、user modelのvalidationが効いて保存できない。validationをなくしたら保存できた。#プログラミング初心者
恐らく中間テーブルにあるuser_idを保存する際、userモデルが「俺に関係するところじゃん!validation効かせるぞ」ってお節介してる。
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
中間テーブルに保存する時、validationをくぐり抜ける方法ないんですかね(泣)
中間テーブルには
:name, precense: true
等は使わんで良い…#プログラミング初心者
解決しました。笑
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
DBへテーブルを保存する時にバリデーションを掛けたら解決しました。エラーメッセージもユーザー登録時、中間テーブル保存時にそれぞれ出た。
つまり
・DB登録時のバリデーションのみでOK。
・中間テーブル利用時はmodelにvalidationを記述しない方がよい。#プログラミング初心者
◆#Rails 多対多のアソシエーション先の表示方法
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
(hogefuga model)
has_many :fugas
has_many :hoges, through: :fugas
(view)
〜
hogefuga.hoges.each do |hoga|
〜
上記では
Could not find the source association(s)
のエラーが出た。解決するにはmodelの記述に工夫が必要。#プログラミング初心者
(hogefuga model)
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
has_many :fugas
has_many :hoges
has_many :hogehoge, through: :fugas, source: :hoge
(view)
〜
hogefuga.hogehoge.each do |hoga|
〜
と記述すると思った通りにいきました。名前が重複するから別名で記述したほうが良いとのこと。
ん〜…少し解せん。#プログラミング初心者
◇参考
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
これ一通りやったらアソシエーションについてしっかり身につきそう!
【初心者向け】丁寧すぎるRails『アソシエーション』チュートリアル【幾ら何でも】【完璧にわかる】 https://t.co/zq5mvERPi7 #Qiita#プログラミング初心者
#今日の積み上げ
— ShowGoGoGo@プログラミング勉強中 (@shshsshsh8) 2019年8月19日
★個人アプリのインクリメンタルサーチ&保存機能実装完了。
★モデルの関係が多対多のDBへの保存機能実装。
★メイン機能のフロント1/4終了。
今日はアソシエーション間のDB保存に時間を割いた。おかげさまで理解が深まりました!明日もこの調子で進める!#プログラミング初心者
今日は中間テーブルを用いた多対多のモデルの関係にあるデータの保存に時間を割いた。なかなかアソシエーション先のデータがDBに保存されない。中間テーブルに保存されなかった。
さらに惑わされたのが、テーブル名って勝手に複数形になったりするじゃないですか。ルーティングのパスは勝手に単数形になるんですよ。ただsをつけたら良いだけの複数形だったら良いんですけど変形するタイプ(今回はlive⇛life)になるもんだからもうどこが複数形でどこか単数形なん?!って迷った。
結論から言うと、中間テーブルに保存されない原因は複数形や単数形は関係なかった。
モデルにバリデーションがかかってて保存する際にそれが邪魔して保存されなかったのだ。バリデーションはDBに保存する時にマイグレーションファイルでかける。DBとモデルで二重に掛ける必要はない。今回みたいに中間テーブルを使う時はなおさらDBだけにバリデーションをかけるべき。じゃないとエラーで保存できない。
さらにアソシエーション先のデータを引っ張り出そうとしたらこれまたエラーになった。アソシエーション先のデータを引っ張ってくる時は別名で保存しないと呼び出せない。なんでやねん。スクールのカリキュラムでやった時はこれでも行けたんやけどなー…もう少し深堀りしたい。
3.明日やりたいこと
メイン機能のフロント実装完了。タスク機能実装。
4.終わりに
今日もたくさん時間かけて勉強して成長したな〜!一歩一歩進んでる!このペースを維持…できればもう少し速歩きのペースで進みたいね!
今日もありがとうございました!また明日〜!
おやすみなさい…zZZ