如何對由created_at
日期列的ActiveRecord查詢返回的數組進行排序?按日期(或任何其他列)對ActiveRecord返回的數組進行排序
查詢執行後會發生這種情況。
請不要告訴我在查詢中這樣做,因爲我需要在視圖中發生這種情況。
如何對由created_at
日期列的ActiveRecord查詢返回的數組進行排序?按日期(或任何其他列)對ActiveRecord返回的數組進行排序
查詢執行後會發生這種情況。
請不要告訴我在查詢中這樣做,因爲我需要在視圖中發生這種情況。
Ruby包含對開箱即用的支持。
sorted = @records.sort_by &:created_at
但是,這似乎與顯示沒有太大關係,可能屬於控制器。
雖然紅寶石Enumerable是真棒,ActiveRecord的查詢實際上將返回一個ActiveRecord ::關係其查詢尚未被評估(延遲加載),並且可以通過調用該命令的方法將該處理卸載到數據庫,在該數據庫中,該數據庫的擴展比基於Enumerable的策略要好得多。
使用Enumerable進行排序也會混淆在數據庫中執行分頁。沒有什麼可以阻止在視圖中應用訂單策略。不過,我傾向於將這一點放在模型的範圍內。
sorted = @records.order(:created_at)
請搶在這一個,並檢查複雜性。
Model.all.sort_by{|m| m.created_at} #=> O(log n)
#versus
Model.order(「created_at DESC」) #=> O(1)
排序ActiveRecord的陣列,最好的辦法是使用默認的方法爲了
@ users.order(:created_at)
這是最快捷,最合適的解決方案,因爲在那大小寫從數據庫返回排序後的數組,並且您不需要在類中使用任何其他操作,例如,如果您將使用建議的sort_by
它將循環拋出數組中的每個元素,之後它將不會是ActiveRecord數組,不在我看來很酷。
order
可以使用字符串和sumbols,這是非常有用的,它需要多個參數
@ users.order( 'created_at ASC,FIRST_NAME遞減,姓氏ASC')
可枚舉#sort_by對於這類事情來說非常棒,比使用Enumerable#sort的其他例子要好得多。 – tadman 2009-08-14 16:21:28
感謝您的澄清。我對同一個視圖有多個「入口點」,查詢可能有也可能沒有相同的排序模式(我知道,並不理想)。但是,不是顯示東西列表的順序不一定是「僅限控制器」功能? – user94154 2009-08-14 16:34:46
tadman - 照顧詳細?這是我從api文檔中瞭解到,sort_by是一種更慢,更靈活的做法。非常適合更復雜的分類,但對於簡單的事情來說太多了。 – 2009-08-14 16:47:43