同じテーブルとの複数の 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 を使用することですが、そのためには別のテーブルが必要です。協会の詳細については、こちらをご覧ください。