はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。
双方向関連付け
下記のように、belongs_to
メソッド、has_many
メソッドを用いることで互いのモデルを関連付けることができる。
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :user
end
上記のように互いのモデルが関連づけられていると、例えばuser.post.name
でユーザーが所持するpost
のname
を取得したり、post.user.name
でpost
が紐づいているuser
のname
を取得したりすることができる。
また、特定のuser
を削除した場合は、そのuser
に紐づくpost
も削除される。
ただし、このようにして関連付けによって値を取得できるのは、Railsの規約通りの名前を使った場合のみである。
ちなみに、双方向関連付けが自動で認識されるようになったのは、Rails4.1以降とのこと。
双方向関連付けが自動認識されない場合
前述したように、Railsの規約通りの名前であれば、モデルに関連付けを記載するだけで、互いのモデルを介して値を取得することができる。
ただし、規約から外れた名前を使う場合は、inverse_of
を用いて双方向関連付けを明示的に宣言する必要がある。
例えば、以下の例はPost
のbelongs_to
で宣言しているauthor
が規約名からは外れている。
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :author, foreign_key: "user_id", class_name: "User"
end
このような場合は、以下のようにUser
側でinverse_of
を宣言することで、双方向関連付けを明示的に示すことができる。
class User < ApplicationRecord
has_many :posts, inverse_of :author
end
class Post < ApplicationRecord
belongs_to :author, foreign_key: "user_id", class_name: "User"
end
参考
最後に
いかがでしたでしょうか。
ここ違うよ!でしたり、こうした方がいいよ!などがあればコメントいただけると幸いです。
他にも下記のような記事を投稿しております。
興味がありましたら、ぜひご覧ください。