見出し画像

備忘録10:Rails-複数テーブルへの保存

転職のための3月6日から某スクールにでプログラミング学習を始めた32歳のおっさんです。時系列でHTML⇨CSS⇨Rails & JavaScript &SQLを学習中。
最近C#にも興味が湧いてきた。


学習内容:複数のテーブルへ同時にデータを保存する


1:開幕の自問自答

①今までは出来なかったの???
 ⇨出来ませんでした。
  form_withのみでは一度に1つのテーブルへしか保存出来ません。
②じゃあ何を使うの?
 ⇨今回、formオブジェクトを使用します。
③どう言うものなの?
 ⇨モデルに属する機能で、コントローラーから来る情報を処理します。
④つまり???
 ⇨formから送られてきた情報を色々都合良く処理出来ます。

と、言う訳で今回はformオブジェクトについてです。
複数テーブルへの保存以外にも利用方法があるようですが
今回は複数テーブル保存の方法について記録してきます。


2:全体の流れ

①modelsにファイルを作成&必要な記述を行う
②バリテーション&データを保存する処理を記述する
③コントローラーを編集する
④ビューを編集する
⑤テストに関する注意点


3:modelsにファイルを作成&必要な記述を行う

スクリーンショット 2021-06-07 1.25.34

このように記述する。

①:何か分かり易い名前を付ける。大体保存するモデル_モデルな感じ。
②:必ず必要になる記述。インスタンスに以下の機能を付け足す。
  ・ActiveRecordを継承したクラス(モデル)と同様の使い方が出来る。
   ⇨form_with・render・バリテーションなど
③:attr_accessorを記述し、カラムを記述する。
  これにより、カラムにゲッター&セッターの定義が出来る。

なお、モデルと同様の機能は持っているものの厳密にはモデルではないため
アソシエーションを組む事はできない。
そのためアソシエーション先は「user_id」といった記述をする必要がある。
また、ここで作成されるテーブルのIDは必要ない。
※SSで言えば order_id はここで生成されるため不要。


4:バリテーション&データを保存する処理を記述する

スクリーンショット 2021-06-07 1.51.04

スクリーンショット 2021-06-07 1.56.18

このように記述を行う。

①:元のモデルにあったバリテーションを移す。カット&ペーストでOK。
  例によってアソシエーションが出来ない。
  その為、アソシエーション先も記述する必要がある。
  ※SSだと「user_id」と「item_id」が該当する。
  また、ここで作成されるテーブルのidは記述不要。
  これから作成するのに先にid寄越せとか意味わかんないじゃんね?
  ※SSではorder_id・shipping_idが該当

②:コントローラーから飛んできたデータを保存する処理を記述する。
  アソシエーションをしている場合
  親になるテーブルを先にcreateし、それから子をcreateする。
  ※子の作成には親のidが必要な為。(SSはorder_id)


5:コントローラーを編集する

スクリーンショット 2021-06-07 2.13.08

このように記述する。全体的にスッキリする。

①:新しいクラスに合わせたインスタンスを生成する。
②:①と同じ。
③:formから送られてくるカラムを全て詰め込む。
  merge先の記述だけ注意。インスタンス変数を使用する。

スクリーンショット 2021-06-07 2.38.40

スクリーンショット 2021-06-07 2.39.12

ネストしてる場合はここも注意。


6:ビューを編集する

スクリーンショット 2021-06-07 2.44.30

このように記述する。

①インスタンス変数が変わったので、インスタンス変数を変える。


7:テストの際の注意点

スクリーンショット 2021-06-07 2.50.24

スクリーンショット 2021-06-07 2.50.43

このように記述する。
例によってモデルではない為、アソシエーションが組めない。

①:テストを行うモデルがDBを参照してレコードを生成する場合
  buildではなくcreateを使用する。違いは以下。
  build⇨メモリ上にインスタンスを生成する。
  create⇨DBにレコードを生成する。テスト後ロールバック。

②:アソシエーションが出来ない為、紐付くテーブルのIDを指定する。
  事前にcreateしたインスタンスのidを指定すればOK。


8:終わりに

今回はこれで終了です。
一見すると手順が多いようですが、実際やるとそうでも無い印象です。
一度に複数テーブルへのデータ保存は非常に利用頻度が高そうなので
習得必須なのかな?と、想像してます。

次回は画像のプレビュー機能辺りにしようかなーと思います。
これも利用頻度高そうなので。





終わり!!!!!!!!!!!!!!!!!!!

この記事が気に入ったらサポートをしてみませんか?