2

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

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

在大多数情况下,它都有效。用户可以更改他们的投票、赞成或反对,并正确返回帖子的分数。

但是,当我得到用户的业力时,如果他们的一个帖子有 2 个赞成票,我希望他们的业力是 20,但会返回 10。知道这里有什么问题吗?

4

1 回答 1

2

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

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

笔记:

如果 与karma不同步votes,您可以查找并删除该karma用户的记录,并在您下次访问时重新生成这些记录。

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

其他一些建议的调整:

  • 你应该定义belongs_to :userPost
  • 你应该定义has_many :postsUser
  • 您的score方法需要传递:votes符号而不是:score
于 2013-08-13T20:54:54.730 回答