我定义了一个非常简单的声誉系统。
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。知道这里有什么问题吗?
答案 0 :(得分:2)
您的Post
模型还需要:source_of
,因此它知道哪些其他信誉引用它,因此可以更新它们:
has_reputation :votes,
:source => :user,
:aggregated_by => :sum,
:source_of => {:reputation => :karma, :of => :user}
注意:
如果karma
与votes
不同步,您可以找到&amp;删除该用户的karma
条记录,并在下次访问时重新生成。
user.reputations.where(reputation_name: 'karma')
其他一些建议调整:
belongs_to :user
Post
has_many :posts
User
score
方法需要传递:votes
符号,而不是:score