2009-08-14 111 views

回答

105

Ruby包含對開箱即用的支持。

sorted = @records.sort_by &:created_at 

但是,這似乎與顯示沒有太大關係,可能屬於控制器。

+2

可枚舉#sort_by對於這類事情來說非常棒,比使用Enumerable#sort的其他例子要好得多。 – tadman 2009-08-14 16:21:28

+1

感謝您的澄清。我對同一個視圖有多個「入口點」,查詢可能有也可能沒有相同的排序模式(我知道,並不理想)。但是,不是顯示東西列表的順序不一定是「僅限控制器」功能? – user94154 2009-08-14 16:34:46

+1

tadman - 照顧詳細?這是我從api文檔中瞭解到,sort_by是一種更慢,更靈活的做法。非常適合更復雜的分類,但對於簡單的事情來說太多了。 – 2009-08-14 16:47:43

24

就叫排序的收集,傳遞的代碼,它告訴紅寶石塊你想要的排序:

collection.sort { |a,b| a.created_at <=> b.created_at } 
+0

非常感謝您的快速響應 – user94154 2009-08-14 15:33:29

+2

與這種情況下的'.sort_by'相比,這樣做效率太低。請查看Chuck的其他答案。 – Dogbert 2011-02-20 10:31:16

+6

爲了記錄,這將比我給出的版本低效。 – Chuck 2013-03-10 21:35:24

25

雖然紅寶石Enumerable是真棒,ActiveRecord的查詢實際上將返回一個ActiveRecord ::關係其查詢尚未被評估(延遲加載),並且可以通過調用該命令的方法將該處理卸載到數據庫,在該數據庫中,該數據庫的擴展比基於Enumerable的策略要好得多。

使用Enumerable進行排序也會混淆在數據庫中執行分頁。沒有什麼可以阻止在視圖中應用訂單策略。不過,我傾向於將這一點放在模型的範圍內。

sorted = @records.order(:created_at) 
1

請搶在這一個,並檢查複雜性。

Model.all.sort_by{|m| m.created_at} #=> O(log n) 

#versus 

Model.order(「created_at DESC」) #=> O(1) 
0

排序ActiveRecord的陣列,最好的辦法是使用默認的方法爲了

@ users.order(:created_at)

這是最快捷,最合適的解決方案,因爲在那大小寫從數據庫返回排序後的數組,並且您不需要在類中使用任何其他操作,例如,如果您將使用建議的sort_by它將循環拋出數組中的每個元素,之後它將不會是ActiveRecord數組,不在我看來很酷。

order可以使用字符串和sumbols,這是非常有用的,它需要多個參數

@ users.order( 'created_at ASC,FIRST_NAME遞減,姓氏ASC')