我正在创建一个具有实现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 的目的(因为我没有利用它的缓存能力)。
所以我想在投票表中添加一列来存储 weighted_score (然后在每次投票时计算),以及投票模型的方法来计算这个分数,但是 gem 不提供当我运行它的生成器时的模型。它只创建了一个投票表,我不知道如何在没有模型的情况下访问它。
对于如何将这样的 weighted_score 列和方法添加到投票模型,或者如何以不同的方式有效地存储帖子的加权分数的任何帮助,我们将不胜感激。