Ruby on rails Rails,Ruby,如何对数组排序?

Ruby on rails Rails,Ruby,如何对数组排序?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,在我的rails应用程序中,我创建了如下数组: @messages.each do |message| @list << { :id => message.id, :title => message.title, :time_ago => message.replies.first.created_at } end @messages.each do| messages| @列出message.id, :title=>messag

在我的rails应用程序中,我创建了如下数组:

@messages.each do |message|

  @list << {
    :id => message.id,
    :title => message.title,
    :time_ago => message.replies.first.created_at
  }
end
@messages.each do| messages|
@列出message.id,
:title=>message.title,
:time\u ago=>message.replays.first.created\u at
}
结束

制作完这个数组后,我想按照ASC顺序按时间排序,可以吗?

是的,您可以通过以下方式使用group\u:

您可以:

@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
@list.sort{a,b | a[:time_-ago]b[:time_-ago]}

您也可以通过{| message | message.time_ago}

 @list.sort_by{|e| e[:time_ago]}
它默认为ASC,但是如果需要DESC,可以执行以下操作:

 @list.sort_by{|e| -e[:time_ago]}
此外,您似乎正在尝试从
@消息
构建列表。您可以简单地执行以下操作:

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

仅供参考,我不认为将消息移动到新列表中然后对其进行排序有什么意义。在我看来,只要是ActiveRecord,就应该在查询数据库时直接执行

看起来您应该可以这样做:

@messages = Message.includes(:replies).order("replies.created_at ASC")
这应该足够了,除非我误解了目的。

在rails 4+中

@list.sort_by(&:time_ago)

更好的是,
@list.sort_by{m | m[:time_ago]}
。谢谢,但是如何定义排序顺序?您可以使用
{message | message.time_ago}
部分定义排序顺序。它被称为
sort\u by
,因为它根据块中的条件进行排序。这里,我们说的是按元素的
.time\u ago
成员进行排序。它总是在上升。要进行降序排序,我们可以按照该值的负值进行升序排序,如Mike Lewis的回答所述:如果它不起作用,那是因为时间之前的任何类型都没有定义否定/所以我在构建@list之前就这么做了?或我在之后尝试了它,但出现了以下错误:NoMethodError(未定义的方法'time\u ago'for#):在构建
@list
后执行此操作。所以
@messages.each do | message |@list message.id,:title=>message.title,:time_ago=>message.repries.first.created_at}end
@list.sort_by…
对于DESC,在2011年4月20日星期三20:40:35 UTC中尝试了未定义的方法“-@”:Time@list=@list.sort_by{e|e[:time_ago]}在最糟糕的情况下,您仍然希望以编程方式(如不通过SQL)执行此操作,您可以执行
@list.sort_by{e | e[:time|u ago]}.reverse
,但这对您来说非常奇怪。Rails 4中断了此链接。可以在这里找到旧文档:它是关于排序而不是分组的