在Rails中使用Reddit样式加权算法的Act_As_Votable

ste*_*eve 8 ruby ruby-on-rails

我正在创建一个rails应用程序,它具有实现Act_As_Votable gem的User和Post模型.

我希望用户能够对帖子进行upvote和downvote,但也希望通过weighted_score算法对帖子进行排名和排序,该算法考虑了创建帖子的upvotes,downvotes和time的数量.

我的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
Run Code Online (Sandbox Code Playgroud)

我想使用Acts_As_Voteable gem,因为它支持缓存,这可能会减少硬盘写入次数并节省时间.目前,帖子的weight_score可以动态计算,但不保存在数据库中,这意味着我不能对具有最高权重的帖子进行数据库排序.

如果我在帖子模型中创建了一个列,那么每次用户在帖子上投票时我都必须更新posts表,这违背了使用Acts_As_Tagable gem的目的(因为我没有利用它的缓存能力).

因此,我想在投票表中添加一列来存储weighted_score(每次投票时都会计算),以及投票模型计算此分数的方法,但宝石不提供我运行它的发电机时的模型.它只创建一个投票表,我不知道如何在没有模型的情况下访问.

关于如何将这样的weighted_score列和方法添加到投票模型,或者如何以不同方式有效地存储帖子的加权分数的任何帮助都是值得赞赏的.

bri*_*ver 4

acts_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
Run Code Online (Sandbox Code Playgroud)

如果要添加列,可以在其创建的表上正常运行迁移。它似乎也创建了一个投票模型http://juixe.com/svn/acts_as_voteable/lib/vote.rb