在我的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進行排序完畢,這可能嗎?
在我的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進行排序完畢,這可能嗎?
@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 }
}
是的,你可以使用GROUP_BY:
http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by
軌道4打破了這種聯繫。舊文檔可以在這裏找到:http://api.rubyonrails.org/v3.2.19/classes/Enumerable.html#method-i-group_by – DonPaulie 2014-08-19 17:19:38
你可以這樣做:
@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
更重要的是,'@list.sort_by {| M | m [:time_ago]}'。 – 2011-04-21 03:36:29
你也可以做@list.sort_by { |message| message.time_ago }
謝謝,但你如何定義排序順序? – AnApprentice 2011-04-21 03:38:59
您可以使用'{| message |'來定義排序順序message.time_ago}'部分。它被稱爲'sort_by',因爲它按塊中的條件排序。在這裏,我們說要按元素的'.time_ago'成員排序。它總是排序上升。爲了排序遞減,我們可以按照邁克劉易斯的回答中所描述的那種負值來升序排列。 :)如果它不起作用,那是因爲無論'time_ago'類型有沒有定義否定。 :/ – 2011-04-21 09:50:03
只是FYI,我沒有看到移動消息到一個新的列表,然後排序他們的觀點。只要它是ActiveRecord,在我看來應該在查詢數據庫時直接完成。
看起來你應該能夠做到這一點是這樣的:
@messages = Message.includes(:replies).order("replies.created_at ASC")
這應該是足夠的,除非我有誤解的目的。
在軌4+
@list.sort_by(&:time_ago)
所以我在建立@list之前這麼做?要麼?我和它的錯誤與後試了一下:NoMethodError(未定義的方法'TIME_AGO」爲#<哈希:0x10e8ac1e0>): – AnApprentice 2011-04-21 03:41:22
你這樣做你建立後'@ 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
對於DESC,試過了,未定義的方法' - @」爲週三4月20日20時40分35秒UTC 2011:時間 – AnApprentice 2011-04-21 03:43:45