🐷
【Rails】belongs_toにforeign_key!?
概要
アソシエーションに別名を付けたい場合などにつかう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
調査結果
記載した記事のもので言えば、おそらく単純にマイグレーションファイルにて外部キー制約をつければ良さそう。
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