在我的Rails应用程序中,我创建了一个数组,代码如下:
@messages.each do |message|
@list << {
:id => message.id,
:title => message.title,
:time_ago => message.replies.first.created_at
}
end
我创建了这个数组后,想按照 time_ago 的升序对其进行排序,是否可能?
在我的Rails应用程序中,我创建了一个数组,代码如下:
@messages.each do |message|
@list << {
:id => message.id,
:title => message.title,
:time_ago => message.replies.first.created_at
}
end
我创建了这个数组后,想按照 time_ago 的升序对其进行排序,是否可能?
@list.sort_by{|e| e[:time_ago]}
默认情况下,它是升序排列,但如果您想要降序排列,可以执行以下操作:
@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 }
}
在Rails 4+中
@list.sort_by(&:time_ago)
你可以这样做:
@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]}
@list.sort_by { |m| m[:time_ago] }
。 - Sophie Alpert@list.sort_by { |message| message.time_ago }
进行排序。{ |message| message.time_ago }
部分来定义排序顺序。它被称为 sort_by
,因为它按照块中的条件进行排序。在这里,我们要按元素的 .time_ago
成员进行排序。它总是升序排序。要进行降序排序,我们可以按该值的负数进行升序排序,如 Mike Lewis 的答案所述。 :) 如果不起作用,那是因为 time_ago
的类型没有定义否定。 :/ - Karl Knechtel仅供参考,我认为将消息移动到新列表然后进行排序没有意义。在我的看法中,只要是ActiveRecord,应该直接在查询数据库时完成。
看起来您应该可以这样做:
@messages = Message.includes(:replies).order("replies.created_at ASC")
除非我误解了目的,否则这应该足够了。
是的,你可以使用 group_by:
http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by
@list
之后执行此操作。因此,`@messages.each do |message| @list << { :id => message.id, :title => message.title, :time_ago => message.replies.first.created_at } end`@list.sort_by...
- Mike Lewis@list.sort_by{|e| e[:time_ago]}.reverse
,但这真的很奇怪,因为它对您不起作用。 - Mike Lewis:time_ago
是一个数字值。你需要减去Time.now - message.replies.first.created_at
来获得一个数字的:time_ago
,然后反向排序就会起作用了。 - Chloe