Rails,Ruby,如何对数组进行排序?

AnA*_*ice 63 ruby ruby-on-rails ruby-on-rails-3

在我的rails应用程序中,我正在创建一个这样的数组:

@messages.each do |message|

  @list << {
    :id => message.id,
    :title => message.title,
    :time_ago => message.replies.first.created_at
  }
end
Run Code Online (Sandbox Code Playgroud)

在制作这个数组之后,我想通过time_ago ASC命令对它进行排序,这可能吗?

Mik*_*wis 133

 @list.sort_by{|e| e[:time_ago]}
Run Code Online (Sandbox Code Playgroud)

它默认为ASC,但是如果你想要DESC,你可以这样做:

 @list.sort_by{|e| -e[:time_ago]}
Run Code Online (Sandbox Code Playgroud)

此外,您似乎正在尝试构建列表@messages.你可以简单地做:

@list = @messages.map{|m| 
  {:id => m.id, :title => m.title, :time_ago => m.replies.first.created_at }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于DESC,尝试得到,未定义的方法` - @'for Wed Apr 20 20:40:35 UTC 2011:Time (4认同)
  • 在绝对最糟糕的情况下,您仍然希望以编程方式执行此操作(如不通过SQL),您可以执行`@ list.sort_by {| e | e [:time_ago]}.reverse`但是它真的很奇怪它对你不起作用. (4认同)

grz*_*zuy 11

你可以这样做:

@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,`@ list.sort_by {| m | m [:time_ago]}`. (2认同)

Eri*_*oss 8

在轨道4+

@list.sort_by(&:time_ago)
Run Code Online (Sandbox Code Playgroud)


Dyl*_*kow 5

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