LoginSignup
2
1

More than 1 year has passed since last update.

【Rails】主キー以外でテーブル間を関連付ける

Last updated at Posted at 2022-03-15

前提条件

以下のような関係性を想定します。
staff(職員)の中には、manager(マネージャー)の権限を持っている者がいて、
managerassessment(評価)することができる。
今回は赤枠(manager-assessments)に焦点を絞る。
(「初めからmanager_idを主キーにすればいいじゃん」
というツッコミは今回スルーさせていただきます。m(_ _)m )
image.png

やりたいこと

primary_keyを意図的に変更したい。
(関連づけの際に主キー(primary_key)を選択しない場合、(Rails が空気を読んで)
manager_idprimary_keyになる。)

方法

以下をモデルに追記すればOK

Manager.rb
has_many :assessments, primary_key: 'staff_id', foreign_key: 'input_staff_id'

has_many :(複数形), primary_key: 主キーになるカラム, foreign_key: 外部キーにしたい関連先のカラム
Assessment.rb
belongs_to :manager, primary_key: 'staff_id', foreign_key: 'input_staff_id'

belongs_to :(単数系), primary_key: 主キーにしたい関連先のカラム, foreign_key: 外部キーになるカラム

上記の設定をすることでいつものRailsらしい書き方ができる。

特定のマネージャーに紐づく、評価を全て取得したい
manager = Manager.find_by(staff_id: 10)
manager.assessments  

参考にした記事

Railsで主キーをid以外に設定し、ほかのテーブルとアソシエーションを結ぶ

↓ 関連づけでエラーが出れば以下を参照↓
Validation failed: モデル must existエラー

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1