如何避免通过关联使用has_many在连接表中创建重复记录?

时间:2017-02-22 09:48:25

标签: ruby-on-rails ruby postgresql activerecord associations

我有两个模型PhysicianPatient和一个联接模型Appointment,关联如下:

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

我想在有新内容时更新appoinment_data表格中的appointmentappointment表中输入。

所以在rails控制台中:

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

它在records表中创建了两个appointment。 一条appointment_datapatient_id的记录。其他与physician_idpatient_id

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我找到了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表中创建一条记录。