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