2016-04-28 47 views
0

我很努力地理解group如何在Rails中工作。目前並沒有真正出現任何好的教程要麼...Rails + postgres:在has_many上使用Group查詢通過

class Doctor 
    has_many :appointments 
    has_many :patients, through: :appointments 
end 

class Appointment 
    has_many :doctors 
    has_many :patients 
end 

class Patient 
    has_many :appointments 
    has_many :doctors, through: :appointments 
end 

Doctor類有一個字段primary_doctor。 A patient可以有許多doctors,但只有一個primary_doctor

給出了具體的doctor,我想那個醫生看到所有patients的列表,由primary_doctor每個patient分組。

doctor.patients.joins(:appointments).where(appointments: { is_primary: true }).group("patients.id, appointments.doctor_id") 

是我覺得應該工作,但不做任何分組。如果我添加一個.count到最後,它幾乎給我我想要的,但不是實際的對象,我得到了一個散列{doctor_id=>patient_count}

想法?謝謝!

+0

我想你需要在分組後選擇你需要的字段。 – Alfie

回答

2

如果我正確理解你的問題,你需要使用Ruby的內存group_by函數。除非我錯過了過去10年的某些事情,否則ActiveRecord無法將數據庫查詢直接編入要查找的表示類型中。

因此,要獲得該醫生認爲所有的患者,由primary_doctor爲每一個病人分組列表,你可以這樣做:

doctor.patients.joins(:appointments).where(appointments: { is_primary: true }). 
    group_by(&:primary_doctor) 

這將給你喜歡的結果:

{ 
    <Doctor id: 1, name: "Dr Bob"> => 
    [<Patient id: 1, name: "Joe">, 
    <Patient id: 2, name: "Jane">], 
    <Doctor id: 2, name: "Dr Spock"> => 
    [<Patient id: 3, name: "Jack">, 
    <Patient id: 4, name: "Jill">, 
    <Patient id: 5, name: "Scotty">] 
} 

請注意,如果您每次都必須返回數據庫以獲取primary_doctor,則這可能會稍微低效,所以如果這是您應用程序中的關鍵路徑,那麼您可能還會在某處使用includeshttp://apidock.com/rails/ActiveRecord/QueryMethods/includes)。

+0

你確定嗎? API文檔說它很可能獲得一組記錄。 http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-group – max

+0

由AR返回的集合是一個一維數組,即使在您鏈接的文檔中,有時在某些邊緣情況下除外像'count'。你說過你想要一張主要醫生的地圖(比如紅寶石,散列結構),以及一系列病人。 SQL'group'用於在編組之前將許多行編譯爲單個表示*;這不是你在這裏所要求的,至少。 – Woahdae

+1

在我的答案中增加了示例輸出,以便您可以看到它與AR文檔的不同之處,以及它是否是您的意思。 – Woahdae