2011-04-21 126 views
57

在我的Rails應用程序我創建這樣一個數組:Rails,Ruby,如何對Array進行排序?

@messages.each do |message| 

    @list << { 
    :id => message.id, 
    :title => message.title, 
    :time_ago => message.replies.first.created_at 
    } 
end 

使這陣,我想再由TIME_AGO ASC進行排序完畢,這可能嗎?

回答

119
@list.sort_by{|e| e[:time_ago]} 

則默認爲ASC,但是如果你想要DESC你可以這樣做:

@list.sort_by{|e| -e[:time_ago]} 

此外,它似乎是你試圖從@messages建立名單。你可以簡單地做:

@list = @messages.map{|m| 
    {:id => m.id, :title => m.title, :time_ago => m.replies.first.created_at } 
} 
+0

所以我在建立@list之前這麼做?要麼?我和它的錯誤與後試了一下:NoMethodError(未定義的方法'TIME_AGO」爲#<哈希:0x10e8ac1e0>): – AnApprentice 2011-04-21 03:41:22

+1

你這樣做你建立後'@ list'。所以'@messages.each do | message | @list << { :ID => message.id, :標題=> message.title, :TIME_AGO => message.replies.first.created_at } end' '@ list.sort_by。 ..' – 2011-04-21 03:41:55

+3

對於DESC,試過了,未定義的方法' - @」爲週三4月20日20時40分35秒UTC 2011:時間 – AnApprentice 2011-04-21 03:43:45

10

你可以這樣做:

@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]} 
+2

更重要的是,'@list.sort_by {| M | m [:time_ago]}'。 – 2011-04-21 03:36:29

5

你也可以做@list.sort_by { |message| message.time_ago }

+0

謝謝,但你如何定義排序順序? – AnApprentice 2011-04-21 03:38:59

+0

您可以使用'{| message |'來定義排序順序message.time_ago}'部分。它被稱爲'sort_by',因爲它按塊中的條件排序。在這裏,我們說要按元素的'.time_ago'成員排序。它總是排序上升。爲了排序遞減,我們可以按照邁克劉易斯的回答中所描述的那種負值來升序排列。 :)如果它不起作用,那是因爲無論'time_ago'類型有沒有定義否定。 :/ – 2011-04-21 09:50:03

3

只是FYI,我沒有看到移動消息到一個新的列表,然後排序他們的觀點。只要它是ActiveRecord,在我看來應該在查詢數據庫時直接完成。

看起來你應該能夠做到這一點是這樣的:

@messages = Message.includes(:replies).order("replies.created_at ASC") 

這應該是足夠的,除非我有誤解的目的。

3

在軌4+

@list.sort_by(&:time_ago)