前提条件
以下のような関係性を想定します。
staff(職員)
の中には、manager(マネージャー)
の権限を持っている者がいて、
manager
はassessment(評価)
することができる。
今回は赤枠(manager-assessments)
に焦点を絞る。
(「初めからmanager_idを主キーにすればいいじゃん」
というツッコミは今回スルーさせていただきます。m(_ _)m )
やりたいこと
primary_key
を意図的に変更したい。
(関連づけの際に主キー(primary_key)
を選択しない場合、(Rails が空気を読んで)
manager_id
がprimary_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エラー