如何避免通过关联在has_many连接表中创建重复记录?
问题描述:
我有两个型号Physician
,Patient
和联接模型Appointment
和协会就像如下:如何避免通过关联在has_many连接表中创建重复记录?
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
accepts_nested_attributes_for :patients
end
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, through: :appointments
accepts_nested_attributes_for :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
end
我想在appointment
表更新appoinment_data
时,有在appointment
表中的新 条目。
所以在轨控制台:
a = Physician.last
#<Physician id: 1, name: "Hamza", address: "Pune", created_at: "2017-02-22 07:07:10", updated_at: "2017-02-22 07:07:10">
a.update(patients_attributes: [{ name: 'Prajakta', disease: 'Fever', appointments_attributes: [{appointment_data: DateTime.now}]}])
(0.7ms) BEGIN
SQL (0.9ms) INSERT INTO "patients" ("name", "disease", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["name", "Prajakta"], ["disease", "Fever"], ["created_at", "2017-02-22 08:30:22.321863"], ["updated_at", "2017-02-22 08:30:22.321863"]]
SQL (0.8ms) INSERT INTO "appointments" ("appointment_data", "patient_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["appointment_data", "2017-02-22 08:30:22.311198"], ["patient_id", 5], ["created_at", "2017-02-22 08:30:22.326373"], ["updated_at", "2017-02-22 08:30:22.326373"]]
SQL (0.9ms) INSERT INTO "appointments" ("physician_id", "patient_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["physician_id", 1], ["patient_id", 5], ["created_at", "2017-02-22 08:30:22.333624"], ["updated_at", "2017-02-22 08:30:22.333624"]]
(1.2ms) COMMIT
=> true
它在appointment
表中创建两个records
。 appointment_data
和patient_id
的一条记录。其他与physician_id
和patient_id
。
我在这里失踪了什么?
答
我找到了一个解决方法,放置accepts_nested_attributes_for
。我现在联想是这样的:
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
accepts_nested_attributes_for :appointments
end
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, through: :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
accepts_nested_attributes_for :patients
end
我在控制台这样做:
a = Physician.last
a.update(appointment_attributes: [{appointment_data: DateTime.now, patient_attributes: {name: 'Rajesh', disease: 'fever'}}])
它现在在appointments
表只创建一个记录。