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

ほとんどの場合、それは機能します。ユーザーは自分の投票、賛成票または反対票を変更でき、投稿のスコアが正しく返されます。

ただし、投稿の1つに2つの賛成票がある場合にユーザーのカルマを取得すると、カルマは20であると予想されますが、10が返されます。ここで何が問題なのですか?

4

1 に答える 1

2

モデルPostには も必要です。: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 :userで定義する必要がありますPost
  • has_many :postsで定義する必要がありますUser
  • メソッドは、代わりにシンボルscoreを渡す必要があります:votes:score
于 2013-08-13T20:54:54.730 に答える