2013-08-05 196 views
2

我在學習rails,而且我被查詢困住了。我的模特擁有多對多的關係。我很難解釋我使用的模型,因爲它們對於我的工作領域來說過於具體,所以我將使用rails guide中的示例稍作修改。查詢Rails中的多對多關聯

這裏的模型:

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

class Appointment < ActiveRecord::Base 
    attr_accessor :appointment_time 

    belongs_to :physician 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    attr_accessor :name, :age 

    has_many :appointments 
    has_many :physicians, through: :appointments 
end 

我想病人自己Appointment.appointment_time列表。 我可以使用physician.patients列出所有與醫生相關的患者。我怎樣才能包括預約時間?一旦我有患者名單,我可以想到詢問預約,但我想知道是否有一種「軌道」方式(如physician.patients_with_appointments)。如果不是,那麼有效的方法是什麼?

+2

你爲什麼不希望用 'physician.patients.include(:約會)'? – phts

+0

請注意,您可能無法獲得適用於您的特定代碼的答案,因爲您選擇使用虛擬代碼示例。 – sevenseacat

回答

2
physician.appointments.includes(:patients).each do |appointment| 
    puts appointment.appointment_time 
    puts appointment.patient.name 
end 

**這不是測試

據我知道你正在尋找的軌道方式實際上並不存在。爲了確保你沒有在每個循環中加載每一個循環,你可以使用包含。我不知道我是否將這些包含在正確的位置,因爲我目前無法訪問rails控制檯。

如果有很多的記錄,你可能想批量發現使用find_each但你的例子這應該工作。

+0

這樣做更有意義,因爲那樣你也可以在約會時間做點事情。 – sevenseacat

0

正如phil.ts說:

patients = physician.patients.include(:appointments) 

會做的伎倆。

現在,當你這樣做:因爲軌知道,包括他們在第一個查詢

patients.appointment 

數據庫將不再需要額外的查詢。

+0

'patients.appointment'將會出錯,因爲'patient'是一個ActiveRecord :: Relation。你還包括'預約'而不是'預約',所以對於每個病人你都會有一系列約會,而不僅僅是一個約會。 – sevenseacat