排序代码中存在错误,不涉及任何回调

时间:2014-04-02 10:12:52

标签: 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

制作完这个数组之后,我想按照time_ago ASC的顺序对它进行排序,这可能吗?

并且有什么方法可以改变我之间的顺序,我可以使用任何回调。请建议。

2 个答案:

答案 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]}

应该有效