2012-01-04 8 views
0

ではこれがCustom, Efficient, Complex Ordering in Rails 3注文は、Railsの

へのフォローアップの質問です私は私が持っているレールモデルのための効率的な発注方法を開発したいと思います。 「popularity」という名前のフィールドにすべてのオブジェクトの評価を保存するとします。この評価で並べ替えるには、次のようにします:

Model.order('popularity ASC') 

作成時のスキューはどのようにして注文しますか?おそらく、生成タイムスタンプを整数値に変換して、より古いオブジェクトのレーティングが時間の経過とともに減少するようにpopularity-created_atでソートする方法はありますか? IEのようなもの:

Model.order('popularity-integerize(created_at) ASC') 

So:これはどうすれば効率的ですか?お使いのモデルで

+0

私は定期的な仕事をして評価を下げます(別の列のコピーかもしれません) –

+0

digg/SOスタイルのウェブサイトを実行する方法を探しているなら、 http://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions – muffinista

+0

あなたのご意見ありがとうございました。それは答えではありませんしかし確かに関連して、そして良い読書!ありがとう。 @SergioTulentsevはい、それは可能です、私は別の方法を理解できない場合、私はそれに戻ってきます – jay

答えて

0

人気度を計算するときは、作成時間を考慮してください。

+0

これは最善の方法と思われます。シンプル! – jay

0

あなたのコントローラでそれを呼び出したいとき、あなたは

class Model < ActiveRecord::Base 
    def decaying_popularity 
    popularity + created_at.to_i # created_at is larger for newer creations. 
    end       # you'll obviously need to edit the formula you use. 

    def self.order_by_decaying_popularity 
    models = self.all 
    models.sort {|a,b| a.decaying_popularity <=> b.decaying_popularity } 
    end 
end 

...の線に沿って何かを行うことができます:

Model.order_by_decaying_popularity 

それは他の句で素晴らしいプレーすべきです:

Model.where(:author_id => 1).order_by_decaying_popularity 
+0

ちょっと、あなたの入力のためにありがとう。残念ながら、私はこれが最適ではない解決策であると感じています。これは、毎回ソートするデータベースからすべてのエントリを引き出す必要はありませんか?確かにそれはデータベースの成長に伴って非常に遅くなるでしょう。代わりに真の注文方法を探しています。あるいは、SQLがソリ​​ューションに参加しています。どう思いますか? – jay

+0

はい、間違いなくすべてのレコードを取得します。 :-) –

+0

コンソールで遊んでいただけでした。明らかにあなたは数式でソートすることができます。作成時にcreated_at.to_iを保存すると(おそらくcreated_at_intと呼ばれます)、Model.order( "popularity + created_at_int")を呼び出すことができます。 – niiru

関連する問題