2
1

More than 1 year has passed since last update.

同じテーブルに複数の関連づけ

Last updated at Posted at 2022-03-12

前提条件

Staff(職員)は複数のAsessments(評価)を持っている。その評価には評価される人(staff_id)と評価する人(input_staff_id)が存在する。

image.png

やりたいこと

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_staffstaffが使用できるメソッドになる。

Staff.rb
has_many :input_assessments, foreign_key: 'staff_id', class_name: 'Assessment'
has_many :assessments, foreign_key: 'staff_id'

input_assessmentsassessmentsが使用できるメソッドになる。

使い方

以下のように呼び出すことができるようになる

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(条件))

参考にした記事

アソシエーションにおけるclass_nameの定義!

belongs-toで追加されるメソッド

has-manyで追加されるメソッド

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