1

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

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

54993post_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.

4

3 回答 3

2

如果您确实需要在内存中使用该数组而不是使用 DB 查询对数据进行排序,请尝试以下操作:

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

但是使用查询订购是首选方式:

Post.order(:posted_at)

希望能帮助到你 :)

于 2013-03-12T21:49:59.183 回答
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] }
于 2013-03-12T22:02:25.083 回答
0

问题中有一个错字确实改变了问题,所以如果 post_ids 排序正确,我首先想到的是:

posts = []

post_ids.each do |post_id|
    posts << Post.find(post_id)
end
于 2013-03-12T21:32:04.123 回答