Rails Active Record Associations:从多个表中获取数据

时间:2015-12-30 18:50:32

标签: ruby-on-rails ruby-on-rails-4 activerecord

我在db中有以下迁移脚本的表:

class CreateAppointments < ActiveRecord::Migration
  def change
    create_table :physicians do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :patients do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :appointments do |t|
      t.belongs_to :physician, index: true
      t.belongs_to :patient, index: true
      t.datetime :appointment_date
      t.timestamps null: false
    end
  end
end

模型类看起来像:

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

我能够使用以下方法挑选特定医师的所有患者数据:

patients = Physician.find(123).patients

问题是,我需要在约会表中存储的appointment_date以及患者详细信息。不知怎的,我无法弄清楚如何获取它。

2 个答案:

答案 0 :(得分:1)

您可以join PatientAppointment模型轻松获取所需数据:

Patient.joins(:appointments).where(. . . ).select('appointments.appointment_date')

您可以将所需条件放在where子句中,并从要选择的select子句中的patientsappointments表中添加更多属性。

有关详细信息,请参阅Active Record Query Interface

更新

我最初误解了你的问题。在他的回答中midN指出了获得你想要的东西的简单方法。

答案 1 :(得分:1)

关系看起来完全正确,所以查询应该很容易,或者你有问题吗?

如果您需要appointment_date,我可能会查询医生约会:

Physician.find_by(id: 123).appointments.each do |x|
  print "Date: #{x.appointment_date}\n"
  print "Patient: #{x.patient.name}"
end