0

数学アルゴリズムを使用して、「ホットな」並べ替えタイプを計算しています。基本的に、時間を考慮した長い多桁の浮動小数点数と、特定の期間内の投票数を生成します。

サーバーの負荷を軽減するために mysql にこれを処理させています。この部分は、私のアプリでは非常に重要です。

これがどのように機能するかについての説明は次のとおりです。http://amix.dk/blog/post/19588

数値: 1134028003 は、アプリのリリース データの秒数を定義する任意の数値です。このように、数値はゼロから始まり、時間が経つにつれてゆっくりと成長し、成長します。

これが私がmysqlのために今持っているものです:

  def self.with_hot_ranking
    select("resources.*, (
        round( 
               log10(greatest(abs(resources.score),1)) + 
               if(resources.score > 0, 1, if(resources.score < 0, -1, 0)) * 
               (UNIX_TIMESTAMP(resources.created_at)-1134028003) / 
               45000.0
              , 7)
    ) hot_ranking")
  end

これは私のインスタンス メソッドであり、テスト目的でのみ使用されます。これも正しいことを確認したいと思います。丸めが早すぎるようで、理由がわかりません

  def hot_ranking
    # to sort by hot_ranking use the class method with_hot_ranking instead i.e.
    # Resource.with_hot_ranking.order('hot_ranking DESC')
    s = self.score
    order = Math.log10([s.abs, 1].max)
    sign = s <=> 0
    seconds = epoch_seconds(self.created_at).to_i - 1134028003
    (order + sign * seconds / 45000).round_to(7).to_f
  end
4

1 に答える 1

0

IFの代わりにdouble を使用していることを除いて、リンクされた数式のように見えますSIGN()

于 2012-07-10T19:07:06.893 に答える