2016-09-14 47 views
0

如何訂購ActiveRecord的關係我有2種型號如下:基於列的最後一個記錄相關聯的對象

Client 
has_many :cases 

Case 
belongs_to :client 

讓說我有2個客戶端C1 C2 &。
c1有1個案例,c2有2個案例。

c1 = Client.create(name: 'C1') 
c2 = Client.create(name: 'C2') 
case1 = Case.create(type: 'Normal', client: c1) 
case2 = Case.create(type: 'Normal', client: c2) 
case3 = Case.create(type: 'High', client: c2) 

我想在最後一種情況的類型每個客戶端遞增/遞減的讓所有的客戶和訂單。 所以如果我通過asc命令,我應該有'c1'然後c2的結果。如果我用desc命令,我應該得到'c2'和'c1'的結果。以下是我到目前爲止所嘗試的。

Client.includes(:cases).order('cases.type asc') # => 'C2,C1' 
Client.includes(:cases).order('cases.type desc') # => 'C2,C1' 

由於C2也有類型的情況下,「正常」,我覺得它好像查詢首先找到客戶,然後像做client.cases。然後,我認爲它僅爲每個客戶下的案件下訂單,並且不會將案件交給客戶。
我覺得我的解釋有點混亂。如果你有問題,請給我一個問題。謝謝。

+0

您是否嘗試過使用空數據庫的示例?我認爲它適用於rails 4.可能發生的是,在c2和c1兩種情況下都會返回,因爲具有相同'type'的記錄順序未定義。你用S型的'type'嗎?當您將名稱爲「type」的列用於STI以外的其他目的時,可能會產生不需要的副作用。 – slowjack2k

+0

感謝@ slowjack2k您的評論。我更新了返回的結果,因爲之前它是我的錯誤。無論如何,我的問題是,我要麼升序或降序,結果是一樣的。另一方面,感謝提及使用'type'作爲列名稱的副作用。其實,我的專欄名稱是'case_type',但我只是以類型爲例,而我忘記了這一點。無論如何,我並沒有將它用於STI。 –

回答

0

我改變了'case_type'列而不是'type',因爲我們不能在我們的表中使用列類型。

要按客戶案例的最後記錄的案例類型對數據進行排序,請嘗試此操作。

對於ASC

Client.includes(:cases).sort_by{|m| m.cases.last.case_type} 

對於DESC

Client.includes(:cases).sort_by{|m| m.cases.last.case_type}.reverse 
+0

感謝@Prashant的回答。其實,我已經嘗試過你的選擇,但是當有些客戶沒有任何案例時,我發現了一個錯誤。任何想法來解決這個問題? –

+0

Client.all.sort_by {| m | m.cases.present? ? m.cases.last.case_type:「ZZZ」} –

0

您可以設置默認ordcer的有許多聯想這樣的:

has_many :cases, -> { order 'type asc' } 

這樣,情況總是會按順序返回。所以,你可以使用sort_by設置客戶機上的自定義排序,要求最後一種情況(和確信的情況下進行排序),例如:

Client.includes(:cases).sort_by { |c| c.cases.last.type } 
+0

感謝@Joe的回答。其實,我已經像第二種選擇一樣嘗試了,但是當有些客戶沒有任何案例時,我得到了一個錯誤。任何想法來解決這個問題? –

0

在我的角度來看每一件事工作正常。 您的訂單聲明只能確保訂單typecase_type。 數據庫可以返回

Normal, C1 
Normal, C2 
High, C2 

Normal, C2 
Normal, C1 
High, C2 

cases.type asc

應該發生什麼時type等於你沒有指定。 Rails將按照數據庫返回記錄的順序返回對象。

如果您wan't另一個命令你,你必須指定的順序,例如:

Client.includes(:cases).order('cases.type asc, clients.name asc') 

編輯:

要在可以使用的最後depentend記錄只訂購子查詢:

Client.select('(SELECT cases.type from cases where cases.client_id=clients.id ORDER BY cases.id desc LIMIT 1) as case_type_name, *').order('case_type_name asc') 
相關問題