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