top_logo

任意の外部キーでhas_many, belongs_to

2022年 04月 20日

Rails で自動推測される外部キーではなく、値をして外部キーを指定する方法。

1 対多でカラム指定


次のような親テーブル、子テーブルがあるとする。


[モデルの関係]
User
↓
↓ has_many
↓
Book

よくある使い方は、booksテーブルに外部キーとしてuser_id用いて、has_many, belongs_toを使う。


今回がbooksテーブルにbuyer_idを指定して、has_many,belongs_toを使う方法を説明します。


解説

すでにbooksテーブルにbuyer_idがあるものとします。


結論以下のようにします
user.rb
has_many :bought_books, class_name: 'Book', foreign_key: 'buyer_id'

これによってuser.bought_booksで’buyer_id’を外部キーとしてhas_manyすることができます。


booksテーブルからbelongs_toする場合も同じようにできます。

book.rb
belongs_to :buyer, class_name: 'User', foreign_key: 'buyer_id'

book.buyerが使用可能です。

多対多でカラム指定


考え方は同じです。


次のような多対多の関連付けがあるとします。


[モデルの関係]
User
↓           ↓
↓ has_many  ↓ has_many through
↓           ↓
Like        ↓
↓           ↓
↓           ↓
↓           ↓
Idol

ユーザーが好きなアイドルグループのメンバーをlikeする設計です。


まずはシンプルにusersテーブルの外部キーを likesテーブルのlike_idとしたいので以下のようにします

user.rb
has_many :likes

likesテーブルのrecommended_ididols テーブルへの外部キーになるとします。


その場合以下のように書きます。

like.rb
belongs_to :recommended, class_name: 'Idol', foreign_key: 'recommended_id'

そしてusersテーブルからlikesテーブルを通して idols テーブルを取得するには以下のようなコードを追加します。

user.rb
has_many :likes
# 追加
has_many :recommended_idols, through: :likes, source: :recommended

like.rbbelongs_to :recommendeduser.rbsource: :recommendedが対応しています。


user.recommended_idolsで like したアイドルを取得できます。


以上になります!読んでくださってありがとうございました!


解りにくいところ、間違っているところなどあれば連絡いただければと思います。

連絡先

何か連絡をしたい際は以下 SNS、メールでお願いいたします。

Twitter:  https://twitter.com/naka_ryo_z

Github:  https://github.com/ryotaro-tenya0727

メール:   ryotaro123110@gmail.com

見出しへのリンク

© 2024, written by Nakayama

Powered by Gatsby