前提条件
Staff(職員)は複数のAsessments(評価)を持っている。その評価には評価される人(staff_id)と評価する人(input_staff_id)が存在する。
やりたいこと
StaffがAssessmentテーブルのstaff_idとinput_staff_idの両者共に関係を持つようにModelに追記したい。
方法
外部キー(foreign_key)と関連先のクラス名(class_name)を指定するだけでOK。
Assessment.rb
belongs_to :input_staff, foreign_key: 'input_staff_id', class_name: 'Staff'
belongs_to :staff, foreign_key: 'staff_id'
input_staff
とstaff
が使用できるメソッドになる。
Staff.rb
has_many :input_assessments, foreign_key: 'staff_id', class_name: 'Assessment'
has_many :assessments, foreign_key: 'staff_id'
input_assessments
とassessments
が使用できるメソッドになる。
使い方
以下のように呼び出すことができるようになる
assessment = Assessment.find(10)
staff = staff.find(10)
評価を登録したstaffを取得したい時
assessment.input_staff
評価されるstaffを取得したいとき
assessment.staff
入力した評価を取得したい時
staff.input_assessments
評価されたstaffの評価を取得したい時
staff.assessments
また、joinsの中にも使うことができる
シンプルなjoins
staff.joins(:input_assessments)
staffテーブルと連結する関連先カラムの条件で絞り込みしたい時
staff.left_joins(:input_assessments).merge(Assessment.where(条件))