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

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")

attribute がない場合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 に答える
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 に答える
0

質問にタイプミスがあり、それが実際に質問を変更しているので、post_idsが正しくソートされている場合、最初に頭に浮かぶのは次のとおりです。

posts = []

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