🐷

【Rails】belongs_toにforeign_key!?

2023/03/15に公開

概要

アソシエーションに別名を付けたい場合などにつかうforeign_keyだが、belongs_to側にもforeign_keyを使用している例を見つけ、ネットでググってみても同様の使い方をされている方を発見したものの疑問だったため改めて他にやり方はないか考えてみた。

class Shop < ApplicationRecord
  has_many :customers, foreign_key: 'visit_shop_id'
end

class Customer < ApplicationRecord
  belongs_to :shop, foreign_key:'visit_shop_id'
end
create_table :shops do |t|
  t.string :name
end

create_table :customers do |t|
  t.string :name
  t.integer :visit_shop_id
end

https://310nae.com/association-foreign-key/

調査結果

記載した記事のもので言えば、おそらく単純にマイグレーションファイルにて外部キー制約をつければ良さそう。

create_table :shops do |t|
  t.string :name
end

create_table :customers do |t|
  t.references :shop, null: false, foreign_key: true
  t.string :name
end
class Shop < ApplicationRecord
  has_many :customers
end

class Customer < ApplicationRecord
  belongs_to :shop
end

ただし、visit_shop_idという外部キーにこだわるなら以下のようにマイグレーションファイルでテーブル作成する時点ですでにアソシエーション名を意識すれば、割とすっきりにできそう。

create_table :shops do |t|
  t.string :name
end

create_table :customers do |t|
  t.references :visit_shop, null: false, foreign_key:  { to_table: :shop }
  t.string :name
end
class Shop < ApplicationRecord
  has_many :customers, foreign_key: "visit_shop_id"
end

class Customer < ApplicationRecord
  belongs_to :shop
end

まとめ

とはいえ、業務をやっていると、どうしてもカラム名は変えたくなくて、
foreign_keyオプションでなんとかやりくりしちゃう場面はあるので、そういうゴリ押しテクニックも1つもっておくといいのかもってところですね。

Discussion