2017-02-22 36 views
1

У меня есть две модели 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 

Я хочу обновить appoinment_data в appointment таблице, когда есть новый запись в 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 

Это создает два records в appointment таблице. Одна запись с appointment_data и patient_id. Другое - physician_id и patient_id.

Что мне здесь не хватает?

ответ

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.