任意の外部キーでhas_many, belongs_to
Rails で自動推測される外部キーではなく、値をして外部キーを指定する方法。
次のような親テーブル、子テーブルがあるとする。
[モデルの関係]
User
↓
↓ has_many
↓
Bookよくある使い方は、booksテーブルに外部キーとしてuser_id用いて、has_many, belongs_toを使う。
今回がbooksテーブルにbuyer_idを指定して、has_many,belongs_toを使う方法を説明します。
すでにbooksテーブルにbuyer_idがあるものとします。
has_many :bought_books, class_name: 'Book', foreign_key: 'buyer_id'これによってuser.bought_booksで’buyer_id’を外部キーとしてhas_manyすることができます。
booksテーブルからbelongs_toする場合も同じようにできます。
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としたいので以下のようにします
has_many :likeslikesテーブルのrecommended_idがidols テーブルへの外部キーになるとします。
その場合以下のように書きます。
belongs_to :recommended, class_name: 'Idol', foreign_key: 'recommended_id'そしてusersテーブルからlikesテーブルを通して idols テーブルを取得するには以下のようなコードを追加します。
has_many :likes
# 追加
has_many :recommended_idols, through: :likes, source: :recommendedlike.rb の belongs_to :recommended と user.rbのsource: :recommendedが対応しています。
user.recommended_idolsで like したアイドルを取得できます。
以上になります!読んでくださってありがとうございました!
解りにくいところ、間違っているところなどあれば連絡いただければと思います。
何か連絡をしたい際は以下 SNS、メールでお願いいたします。
Twitter: https://twitter.com/naka_ryo_z
見出しへのリンク