在我的rails应用程序中我正在创建一个这样的数组:
@messages.each do |message|
@list << {
:id => message.id,
:title => message.title,
:time_ago => message.replies.first.created_at
}
end
制作完这个数组之后,我想按照time_ago ASC的顺序对它进行排序,这可能吗?
答案 0 :(得分:131)
@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 }
}
答案 1 :(得分:10)
你可以这样做:
@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
答案 2 :(得分:8)
在rails 4+
中@list.sort_by(&:time_ago)
答案 3 :(得分:5)
您也可以@list.sort_by { |message| message.time_ago }
答案 4 :(得分:4)
仅供参考,我没有看到将消息移动到新列表然后对它们进行排序的重点。只要它是ActiveRecord就应该在我看来查询数据库时直接完成。
看起来你应该能够这样做:
@messages = Message.includes(:replies).order("replies.created_at ASC")
除非我误解了目的,否则这应该足够了。
答案 5 :(得分:1)
是的,您可以使用group_by:
http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by