1対多のアソシエーション
例えばユーザーは複数の掲示板を所有して、掲示板は1人のユーザーに属するようなモデル間で1対多の関連付けを作成したい場合、
ユーザーのモデルをUser、掲示板のモデルをBoard、カラムはtilteをstring型、body(内容)をtext型をすると、
rails g model Board title:string body:string user:references
を実行することで、自動的にインデックスと外部キー参照付きのuser_idカラムを追加でき、UserとBoardを関連付けする下準備をしてくれたり、
Board.rbにbelongs_to :userを記載してくれる
belongs_to関連付けで指定するモデル名は必ず単数形にする必要がある
このbelongs_toの宣言をすることで2つのモデルのそれぞれのインスタンス間で、
主キー、外部キー情報を保持するようにrailsに指示がいく
今回の場合、userのidを主キー、booksのuser_idが外部キーとなる
次に、Userモデルでhas_many関連付けを以下のように宣言する
#user.rb class User < ApplicationRecord has_many :boards end
この時指定するモデルは複数形にする
このように2つモデル間で片方のモデルのインスタンスがもう一つのモデルのインスタンスを複数持つ場合、複数所有する側がでhas_many、所属する側の方でbelongs_toを使うことで、一対多のアソシエーションを定義できる。
またこれらのアソシエーションを定義することで、以下のメソッドを使えるようになる
board.user Boardオブジェクトに紐づいたUserオブジェクトを返す
user.boards Userオブジェクトに紐づいたBoardオブジェクトの集合を返す
user.boards.create(arg) userに紐づいたBoardオブジェクトを作成する
user.boards.create!(arg) 同上ただし失敗時に例外を発生させる
user.boards.build(arg) userに紐づいた新しいBoardオブジェクトを返す
user.boards.find_by(id: 1) userに紐づいた、idが1であるBoardオブジェクトを返す
通常はこのように双方に関連付けをする
また、ユーザーを削除したとき、それに関連づいた掲示板も自動的に削除されるようにしたい場合、
has_many :boards, dependent: :destroy
とdependentオプションでdestroyを指定することでオブジェクトを削除する時、関連づいたオブジェクトをdestroyしてくれる
参考文献
Active Record の関連付け - Railsガイド
【Rails】アソシエーションを図解形式で徹底的に理解しよう! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト