2014-01-31 32 views
1

我有一個距離屬性在我的用戶模型排序不排序然後我就可以對它們進行排序,如:時,包括在軌使用

users.sort_by!(&:distance) 

並得到了用戶根據適當的距離來分類的。但是,當我包含其他相關方法時,例如:

users.includes(:photo).sort_by!(&:distance) 

這根本不會對用戶進行排序,這是爲什麼?我怎樣才能把它與距離排序,但也包括協會?

+0

此外,你有一個默認範圍?像這樣..default_scope order('created_at DESC') – beck03076

+0

只是出於好奇,你的'distance'屬性是如何填充的?如果它是基於其他數據庫字段的計算值,是否可以在數據庫中執行排序,而不是在Ruby中執行排序?如果是這樣的話,它可以爲你節省一些頭痛。 –

回答

1

!表明物體本身的變化,而不是返回一個不同的對象。 當您撥打users.includes(:photo)此方法返回不同的對象。那麼,什麼你實際上做的是這樣的:

users2 = users.includes(:photo) 
users2.sort_by!(&:distance) 

這就是爲什麼用戶對象沒有排序你叫sort_by!後。一個更好的方法可能是

users = users.includes(:photo).sort_by(&:distance) 
+3

如果'distance'屬性是表中的一個字段,您可能還想考慮使用'order(:distance)'。這將對數據庫端的結果進行排序。 –

+0

這是一個很好的觀點,但它不是,它的一個虛擬屬性 – London

+0

@倫敦這就是我在這個問題的評論中所指的。即使字段是從兩列或更多列計算的,它仍然可以在'.order' /'ORDER BY'子句中使用。本質上你只是重寫計算。假設它確實是從數據庫列中計算出來的。 –

0

我相信你應該做的

users.sort_by!(&:distance).includes(:photo) 
+0

如果我這樣做,我得到這個錯誤'NoMethodError - 未定義的方法'包括'爲#:' – London

1

那麼它確實對我來說。我做「用戶」,而不是「用戶」

User.includes(:photo).sort_by!(&:distance) 

什麼是「用戶」變量持有,無論如何?嘗試用戶。

編輯我的例子,在這裏我用戶查詢用戶和得分距離。

1.9.3p385 :059 > Enquiry.all.sort_by!(&:score).map &:score 
     Enquiry Load (0.7ms) SELECT `enquiries`.* FROM `enquiries` 
    => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 10, 10] 

    1.9.3p385 :060 > Enquiry.includes(:follow_ups).sort_by!(&:score).map &:score 
     Enquiry Load (0.1ms) SELECT `enquiries`.* FROM `enquiries` 
     FollowUp Load (0.1ms) SELECT `follow_ups`.* FROM `follow_ups` WHERE `follow_ups`.`enquiry_id` IN (55, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 85, 86, 89, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127) 
    => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 10, 10] 

1.9.3p385 :057 > enquiries = Enquiry.where(status_id: [1,2,3]) 

    1.9.3p385 :061 > enquiries.includes(:follow_ups).sort_by!(&:score).map &:score 
     Enquiry Load (0.5ms) SELECT `enquiries`.* FROM `enquiries` WHERE `enquiries`.`status_id` IN (1, 2, 3) 
     FollowUp Load (0.2ms) SELECT `follow_ups`.* FROM `follow_ups` WHERE `follow_ups`.`enquiry_id` IN (68, 75, 78, 91, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 116, 117, 120, 122, 123, 124, 125, 126, 127) 
    => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 5, 5, 5, 5, 5, 5, 5, 7, 8, 8, 10] 

注意:你的問題是錯誤的,你downvote我。

+0

users = User.where(...)持有用戶的一些條件 – London

0

使用此:

User.includes(:photo).sort_by!(&:distance) 

包括用於模型,而不是陣列。 所以用戶是型號名稱,用戶是數組。

array has'includes?'方法和

型號有「包括」方法

sort_by!方法所以用這個

User.includes(:photo).sort_by!(&:distance) 

代替

users.includes(:photo).sort_by!(&:distance) 
+0

夥計,用戶不是數組。 users = User.where()。所以,包括可以用於用戶。 – beck03076