2

Type Item のオブジェクトがあり、name、view_count、like_count、created_at time の属性があり、これらのオブジェクトのフィードを作成して、最新のオブジェクトを取得できるだけでなく、ビュー カウントに従っても取得したいとします。そしていいねカウント。

作成時間とランクによる並べ替えの使用 = view_count + like_count like

a.sort_by{|x| [x.rank, -x.created_at]}

オブジェクトのタイでのみ使用されるcreated_atによるランク順のソートになるため、誰かがそうする方法を見つけるのを手伝ってくれることを望んでいました.

前もって感謝します。

4

1 に答える 1

1

まず最初に: たくさんのオブジェクト/レコードがある場合、それらを適切に除外できるように、データベースで順序付けを行いたいと思うでしょう。ほとんどの場合、これにはいくつかの利点があります。

1) ソート後に取得するアイテムの数を制限できます (つまり、メモリに多くのアイテムをロードする必要はありません)。

2)インデックスを適切に使用している場合、非常に高速になります

複数の行による並べ替えは簡単で、次の質問への回答で説明されています: Ruby on Rails: how do I sort with two columns using ActiveRecord?

実際の並べ替えに関する限り、メモリ内の配列を並べ替えたい場合は、指定したコードが機能するはずです。

a.sort_by{|x| [x.rank, -x.created_at]}

何が問題なのか説明していただけますか?これは、あなたが指定したように、ランクでソートされ、次に時間でソートされるようです。別の方法 (ランクによって作成されたスコアやアイテムの最新度など) で並べ替えたい場所はどこですか?

編集:

さて、あなたのコメントによって、ランクとアイテムの最新性を混ぜ合わせたスコアを作成したいと思います。いくつかの理由から、これは扱いにくいテーマです。まず、結果をどのようにモデル化/採点するかはあなた次第であり、それに応じて微調整する必要があります (したがってTime.now - item.created_at、ランクを掛けた分数などになるかもしれません。で遊ぶ必要があります)。

よく考えてみると、 ではなく、UNIX スタイルのタイムスタンプを使用する方が良いかもしれませんTime.now - item.created_at。なぜなら、誰かがセキュリティを大幅に台無しにしない限り、数字が大きいほど新しいものになるからです。(エポックの問題にもかかわらず)。さらに、これにより、後で他のことが簡単になる可能性があります。

たとえば、次のようになります。

rank*(item.created_at - 1300000000)/60000000、現在の時間の結果は0.7453 * rankになり、今から1日後に作成されたアイテムの結果は: 0.7467 * rank(少し高くなります)。たぶん、あなたのソリューションはもっと複雑なものになるでしょう。自分の状況に適した方程式を見つけるのは、本当に自分次第です。

もう 1 つの問題は、SQL クエリとインデックスがもう少し複雑になる可能性があることです (ただし、数学 (スコアリング システム) を含む複数の列に基づいてテーブルにインデックスを付けることができます。例を次に示します: http://use-the-index -luke.com/sql/where-clause/obfuscation/math ; これは少しトリッキーに思えるかもしれません。なぜなら、それがどれだけ新しいかは常に変化するからです。タイムスタンプ自体の関数である必要があります (時間とともに増加します) 、したがって、最近のアイテムは本質的により高い値になります))。

基本的に、最初のステップは、ニーズに最適な数学的モデルを正確に把握することです。ちょっと実験。その後は、Rails に効率的に実装する必要があります (正しいデータベース クエリ、インデックスなど)。

于 2012-08-11T19:19:10.427 に答える