3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby on Rails】双方向関連付けを宣言するinverse_of

Posted at

はじめに

Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。

双方向関連付け

下記のように、belongs_toメソッド、has_manyメソッドを用いることで互いのモデルを関連付けることができる。

class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  belongs_to :user
end

上記のように互いのモデルが関連づけられていると、例えばuser.post.nameでユーザーが所持するpostnameを取得したり、post.user.namepostが紐づいているusernameを取得したりすることができる。

また、特定のuserを削除した場合は、そのuserに紐づくpostも削除される。

ただし、このようにして関連付けによって値を取得できるのは、Railsの規約通りの名前を使った場合のみである。

ちなみに、双方向関連付けが自動で認識されるようになったのは、Rails4.1以降とのこと。

双方向関連付けが自動認識されない場合

前述したように、Railsの規約通りの名前であれば、モデルに関連付けを記載するだけで、互いのモデルを介して値を取得することができる。

ただし、規約から外れた名前を使う場合は、inverse_ofを用いて双方向関連付けを明示的に宣言する必要がある。

例えば、以下の例はPostbelongs_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

参考

最後に

いかがでしたでしょうか。
ここ違うよ!でしたり、こうした方がいいよ!などがあればコメントいただけると幸いです。

他にも下記のような記事を投稿しております。
興味がありましたら、ぜひご覧ください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?