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 列とメソッドを投票モデルに追加する方法、または投稿の重み付けされたスコアを別の方法で効率的に保存する方法についての助けをいただければ幸いです。