Techioz Blog

同じテーブルとの複数の has_many 関連付け

概要

各 User に Caregivers テーブルへの 2 つの参照を持たせたいのですが、関係は双方向の has_many になります。問題は、変数 current_user に User があり、次の行を実行するとき、定義に何か間違っているはずであるということです。コントローラー: current_user .reported_caregivers << @caregiver, current_user.save、何も保存されません。

モデルは次のとおりです。

class Caregiver < ApplicationRecord
   has_many :users, dependent: :nullify #first reference to User
   has_many :reporters, :class_name => 'User', dependent: :nullify #new reference
end

class User < ApplicationRecord
   has_many :caregivers, dependent: :nullify #first reference
   has_many :reported_caregivers, :class_name => 'Caregiver', dependent: :nullify #new reference
...

そしてこれらが移行です

class AddReportersToCaregivers < ActiveRecord::Migration[7.0]
   def change
     add_reference :caregivers, :reporters, foreign_key: { to_table: :users}, default: []
   end
end

class AddReportedCaregiversToUsers < ActiveRecord::Migration[7.0]
   def change
     add_reference :users, :reported_caregivers, foreign_key: { to_table: :caregivers}, default: []
   end
end

解決策

activerecord の双方向 has_many 関連付けは使用されません。 User テーブルに介護者が多数いる場合、Caregiver テーブルはbelongs_to :user である必要があります。

各テーブルに他の多くのレコードを持たせたい場合は、has_and_belongs_to_many 関連付けの使用を検討する必要があります。 has_many 関係を双方向に使用する唯一の方法は :through を使用することですが、そのためには別のテーブルが必要です。協会の詳細については、こちらをご覧ください。