8

Act_As_Votable gemを実装する User および Post モデルを持つ Rails アプリを作成しています。

ユーザーが投稿に賛成票と反対票を投じることができるようにしたいだけでなく、賛成票、反対票の数、および投稿が作成された時間を考慮した weighted_score アルゴリズムによって投稿をランク付けおよびソートしたいと考えています。

私の weighted_score アルゴリズムは Reddit から取得したもので、ここでより詳しく説明されています。

私の投稿モデル:

class Post < ActiveRecord::Base
  belongs_to :user
  acts_as_votable

  # Raw scores are = upvotes - downvotes
  def raw_score
    return self.upvotes.size - self.downvotes.size
  end

  def weighted_score
    raw_score = self.raw_score
    order = Math.log([raw_score.abs, 1].max, 10)
    if raw_score > 0
        sign = 1
    elsif raw_score < 0
        sign = -1
    else
        sign = 0
    end
    seconds = self.created_at.to_i - 1134028003
    return ((order + sign * seconds / 45000)*7).ceil / 7.0
  end
end

Acts_As_Voteable gem を使用したいのは、ハードディスクへの書き込み回数を減らして時間を節約できるキャッシュをサポートしているためです。現在、投稿の weight_score はオンザフライで計算できますが、データベースには保存されません。つまり、最も高い weighted_score を持つ投稿でデータベースの並べ替えを行うことはできません。

投稿モデルで列を作成した場合、ユーザーが投稿に投票するたびに投稿テーブルを更新する必要があり、Acts_As_Tagable gem を使用する目的が無効になります (キャッシュ機能を利用していないため)。

したがって、votes テーブルに列を追加して weighted_score (投稿が投票されるたびに計算されます) を格納し、Votes モデルにメソッドを追加してこのスコアを計算したいと考えていますが、gem は提供しません。ジェネレーターを実行したときのモデル。モデルなしでアクセスする方法がわからない投票テーブルを作成するだけです。

そのような weighted_score 列とメソッドを投票モデルに追加する方法、または投稿の重み付けされたスコアを別の方法で効率的に保存する方法についての助けをいただければ幸いです。

4

3 に答える 3

4

act_as_voteable は、投票にアクセスするためのメソッドをモデルに追加します http://juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/

positiveVoteCount = post.votes_for
negativeVoteCount = post.votes_against
totalVoteCount = post.votes_count

列を追加する場合は、作成するテーブルで通常どおり移行を実行できます。投票モデルhttp://juixe.com/svn/acts_as_voteable/lib/vote.rbを作成するようにも見えます

于 2014-12-27T02:42:44.630 に答える
0

MYSQL をそのまま使用して、適切な結果を得ることができます。読みやすくするために複数行を使用します。

Post.order("
  LOG10( ABS( some_score ) + 1 ) * SIGN( some_score ) + 
  ( UNIX_TIMESTAMP( created_at ) / 450000 ) DESC
")

450000は、created_at に対するスコアにさらに重みを与える微調整する数値です。

ゼロに近いほど、新しさが強調されます。

  • 45000その日のスコアをおおまかに返します
  • 450000週のスコアをおおまかに返します
  • 4500000その月のスコアを大まかに返します
于 2016-12-16T22:20:23.013 に答える