プログラミング学習記録

主にRuby on Railsを使ったプログラミングを学んでいます。

rails consoleとテーブル Rails入門②

8月2日はほぼ復習で終わり、8月3日はRUNTEQのイベント「Vimハラ」に参加した。
8月4日、今日はRails入門②「rails consoleを制する者はRailsを制する」と入門フェーズ総復習をした。rails consoleを使って複数のモデルを作り、紐付ける事を学んだ。 学んだことをまとめてみる。

課題ではusersテーブルとtasksテーブル、categoriesテーブル、tasksテーブルとcategoriesテーブルを繋ぐ中間テーブルのtask_categoriesテーブルを作った。そこから、rails consoleを起動させて、user情報のレコード、そのuserのtask、categoryを作り、taskとcategoryを紐付ける事をした。


モデル作成時に外部キーを持たせるには
rails g model モデル名B(単数形) キー1:データ型 キー2:データ型 ... 紐付けたいモデル名(単数形)A:references
のようにターミナルに打ち込む。
こうして作ったモデルBのマイグレーションファイルに、外部キー制約を自動で作ってくれて、Rails6系だとNOT NULL制約を自動でつけてくれる。


Bに紐付いたAを作る
まずアソシエーションを定義する。
app/models/モデル名A.rbに、has_many :Bs(複数形), dependent: :destroy
を追加。 rails consoleを使い、Aのテーブルからidが例えば1のAを探し、aに代入(インスタンスを作る)
a.Bs.create(〇〇: □□)
で作れる。B.create(〇〇: □□, A_id: 1)としても作れるが、上の方法の方がわかりやすい。


中間テーブル
モデル同士を一対一で紐付けたい場合、例えばAとBだとBにA_idを持たせれば良いが、モデルに多対多の関係がある場合は、中間テーブルを作れば良い。(課題ではtaskとcategoryに中間テーブルを持たせた。userとtaskは一対多。)


has_many :〇〇, through: :中間テーブル名
これを中間テーブルで繋がったそれぞれのテーブルのapp/models/テーブル名.rbに入れる。〇〇には他方のモデルの複数形を入れる。
こうすると、rails consoleで情報を取得した時、関係するテーブルの情報も取得できる。これをしないと外部キーのidしか取得できず、同時に扱いたい場合に手数が多くなる。(例えば、タスクとそのカテゴリを同時に表示させたい場合など。task.categoriesで一発でカテゴリ名を表示できる。カテゴリに関しても同様。category.tasksでそのカテゴリのタスクを表示できる。)