ActiveRecord信誉系统 - 仅显示一票的业力

时间:2013-08-11 17:45:08

标签: ruby-on-rails rails-activerecord

我定义了一个非常简单的声誉系统。

class Post < ActiveRecord::Base
  has_reputation :votes, :source => :user, :aggregated_by => :sum

  def upvote(user)
    self.add_or_update_evaluation(:votes, 1, user)
  end

  def downvote(user)
    self.add_or_update_evaluation(:votes, -1, user)
  end

  def score
    self.reputation_for(:score).to_i
  end
end

class User < ActiveRecord::Base
  has_reputation :karma, 
    :source => [:reputation => :votes, :of => :posts, :weight => 10],
    :aggregated_by => :sum

 def karma
    self.reputation_for(:karma).to_i
  end
end

大多数情况下都有效。用户可以更改他们的投票,upvote或downvote,并为帖子正确返回分数。

然而,当我得到一个用户的业力时,他们的一个帖子有2个upvotes,我会期望他们的业力为20,但返回10。知道这里有什么问题吗?

1 个答案:

答案 0 :(得分:2)

您的Post模型还需要:source_of,因此它知道哪些其他信誉引用它,因此可以更新它们:

has_reputation :votes,
  :source => :user,
  :aggregated_by => :sum,
  :source_of => {:reputation => :karma, :of => :user}

注意:

如果karmavotes不同步,您可以找到&amp;删除该用户的karma条记录,并在下次访问时重新生成。

user.reputations.where(reputation_name: 'karma')

其他一些建议调整:

  • 您应该在belongs_to :user
  • 中定义Post
  • 您应该在has_many :posts
  • 中定义User
  • 您的score方法需要传递:votes符号,而不是:score