Ruby在数组中排序哈希有困难

时间:2013-03-12 21:28:33

标签: ruby-on-rails ruby arrays hashtable

我有一个返回以下数组的数据模型:

[[54993, {:posted_at=>1363066554, :item_id=>55007,..}],..]

54993是post_id。我正在尝试使用此数组并按posted_at排序。数组由posted_at正确排序。这是我目前的代码:

  post_ids = UserFeed.new(current_user.id).posts.collect{|x| x[0]}
  posts = Post.where(:id => post_ids)

post_id排序,而不是posted_at。我想弄清楚如何按posted_at排序,并想知道为什么数组会按post_id进行排序。

3 个答案:

答案 0 :(得分:2)

如果您确实需要内存中的数组而不是使用数据库查询对数据进行排序,请尝试以下方法:

method_that_returns_array.sort{ |a, b| a[1][:posted_at] <=> b[1][:posted_at]}

但是使用查询排序是首选方式:

Post.order(:posted_at)

希望有所帮助:)

答案 1 :(得分:2)

where(ids)未设置顺序,它使用SQL IN (id1, id2, ...)。使用ActiveRecord:

post_ids = UserFeed.new(current_user.id).posts.map(&:first)
posts = Post.where(:id => post_ids).order("posted_at ASC")

如果没有属性posts.posted_at,则解决方案1:

posts = post_ids.map { |post_id| Post.find(post_id) }

解决方案2:执行单个查询然后排序:

indexes = Hash[post_ids.map.with_index.to_a]
posts = Post.where(:id => post_ids).sort_by { |p| indexes[p.id] }

答案 2 :(得分:0)

问题中有一个错误确实改变了问题,所以我想到的第一件事是,如果post_id排序正确,那么:

posts = []

post_ids.each do |post_id|
    posts << Post.find(post_id)
end