1対多のアソシエーション
アソシエーションとは
2つのActive Recordモデル同士のつながりのこと。
モデルとモデルの間に関連付けを行う事で
コードでの共通操作をよりシンプルで簡単描けるようになる。
関連付けの仕方(1対多)
モデル作成時に関連付けしたい他のモデルとの関連付けを行う。
1対多の関係で、1のモデルが既にあり、
多のモデルを作成する際(userが1、postが多)
rails g model Post content:text user:references
とすることで、Postモデルにuser_idカラムが追加される。
また、マイグレーションを実行することで
以下のコードがpost.rbに自動的に追加される。
(post.rb) belongs_to :user
あとはuser.rbにpostとの関連を記述して完了。
(user.rb) has_many :posts
(※バリデーションを記載している場合、has_manyもbelongs_toもvalidaionの上に書く)
便利なオプション
- 親を削除したら子も消える dependent: :destroy
userを削除したら紐づくpostもまとめて削除したい場合、
オプションでdependent: :destroyを渡します。
has_many :posts, dependent: :destroy
- 外部キーの指定 foreign_key
postテーブルのuser_idが"外部キー"、postテーブルが"参照元テーブル"、
userテーブルのidが"主キー"、userテーブルが参照先テーブルと言われ、 外部キー名の基本形は"参照先テーブル名(単数形)_id"。 こうすることで作成されたカラムが外部キーであることが認識される。 もしも、違う名前をつけたい、それを外部キーにしたい、 という場合は明示的にそのカラムが外部キーであることを宣言する必要がある。 それがforeign_keyオプション。参照先と参照元のテーブル両方に宣言する。 user_idではなくuser_noにしたい場合、
has_many :posts, foreign_key: 'user_no' belongs_to :user, foreign_key: 'user_no'
参照:Railsガイド
railsguides.jp