在我的rails应用程序中,我正在创建一个这样的数组:
@messages.each do |message|
@list << {
:id => message.id,
:title => message.title,
:time_ago => message.replies.first.created_at
}
end
制作完这个数组之后,我想按照time_ago ASC的顺序对它进行排序,这可能吗?
并且有什么方法可以改变我之间的顺序,我可以使用任何回调。请建议。
答案 0 :(得分:1)
只是做:
@list.sort_by {|hash| hash[:time_ago]}
这不会改变原始数组,因此您需要将其分配给某个变量。如果您想对其进行排序,请使用带有版本的sort_by!
代替。
请注意:您的代码中存在潜在的N + 1问题,因为您的循环可能会在每次重复时执行额外的SQL查询。所以请记住在循环之前调用@messages.includes(:replies)
。使用正确的SQL查询也可能有更快的解决方案。但是,您需要指定为什么您希望time_age成为数据库中消息的第一个值 - 可能是您想要最早的消息吗?
答案 1 :(得分:1)
final_array = @list.sort {|a,b| a[:time_ago] <=> b[:time_ago]}
应该有效