3

次の方法で取得した既存のアクティブレコード配列があります。

@posts = Post.where(["created_at > ?", n_days.days.ago])

そして、複数の列からリアルタイムで計算する必要がある値に基づいて、この配列を注文したいと思います。

posts_array = posts.map { |p| [p.id, f(t, p.x,p.y)] }

これにより、 のような配列が得られます。これを[[1,20],[2,11],[3,14], ...]関数の値に基づいて並べ替えて[[1,20],[3,14],[2,11],...]、最終的order_arrayに必要な を取得します[1,3,2,...]

@posts新しいに基づいて元の配列を並べ替える最良の方法は何order_array [1,3,2,...]ですか? @posts情報はすでに配列に含まれているため、可能であればデータベースに再度触れたくありません。

これを行う簡単な方法はありますか?

4

2 に答える 2

4

配列が必要ない場合は、次のposts_arrayことができます

@posts = Post.where(["created_at > ?", n_days.days.ago])
@posts.sort_by! { |p| f(t, p.x, p.y) }
于 2013-05-09T13:52:11.140 に答える
1

order_array の取得

明らかな答えは次のとおりです。

[[1,20],[2,11],[3,14]].sort{|a,b| b[1] <=> a[1]}.map{|x| x[0]}
 => [1, 3, 2] 

誰かがもっと賢いものを思いつくことができるかどうかわかりませんか?

lazyruby 2.0 では、並べ替え後の配列の拡張を回避するために使用できます (そして、ある程度のパフォーマンスが得られます)。

[[1,20],[2,11],[3,14]].lazy.sort{|a,b| b[1] <=> a[1]}.map{|x| x[0]}

投稿を順番に取得する

最も簡単な解決策は

Post.find(order_array).sort{|a,b| order_array.index(a.id) <=> order_array.index(b.id)}

しかし、単純に良いだろう

order_array.map{|x| Post.find(x)}

または、すでにロードされている@postリストを使用するには:

 order_array.map{|x| @post.find{|y| y.id == x)}
于 2013-05-09T13:44:12.547 に答える