0

考虑以下模型:

class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ActiveRecord::Base
  belongs_to :physician
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  has_many :appointments
  has_many :physicians, through: :appointments
end

目标

  1. 如果不存在,则创建一个患者。
  2. 将患者添加到特定医生(如果尚不存在)

我想,我可以通过两种方式做到这一点:

方法一

physician = Physician.find(physician_id)
unless Patient.where(email: email).empty?
  record = physician.patients.create email: email
else
#Patient already exist, just add them to appointment
  record = Patient.where(email: email)
  physician.patients << record
end

方法二

physician = Physician.find(physician_id)
record = Patient.find_or_create_by(email: email)
# avoid overhead of SQL JOINS, use simple SELECT/CREATE
if Appointment.where(physician_id: physician_id).where(patient_id: record.id).empty?
   Appointment.create physician_id: physician.id, patient_id: record.id
end

现在,哪一个是上述两个更好的方法?另外,在性能方面是否有另一种比上述术语更好的方法?

4

1 回答 1

1

选项3怎么样:

physician = Physician.find(physician_id)
unless physician.patients.where(email: email).exists?
  patient = Patient.find_or_create_by(email: email)
  physician.appointments.create(patient: patient)
end

如果患者已经与该医生预约,这将避免不必要的呼叫find_or_create_by

并且为了记录,调用model.association.create(...)不会执行任何连接。它适用于表示关联的 ActiveRelation 对象,并且只会触发 INSERT 语句。但是,您建议的方法 1 存在其他几个技术问题,并且您的方法 2 是不必要的冗长。

于 2013-10-28T19:43:12.217 回答