任意の外部キーで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 :likes
likes
テーブルの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: :recommended
like.rb
の belongs_to :recommended
と user.rb
のsource: :recommended
が対応しています。
user.recommended_idols
で like したアイドルを取得できます。
以上になります!読んでくださってありがとうございました!
解りにくいところ、間違っているところなどあれば連絡いただければと思います。
何か連絡をしたい際は以下 SNS、メールでお願いいたします。
Twitter: https://twitter.com/naka_ryo_z
見出しへのリンク