在数据库中保存和更新用户业力 - rails

时间:2014-04-16 23:05:03

标签: ruby-on-rails ruby devise-invitable

我在我的rails应用中使用了acts_as_votabledevise_invitable

用户可以发表评论,他们的评论可以投票。

每个用户都有业力/分数

目前我在他们的个人资料上显示用户业力。我实际上并没有将他们的分数保存在数据库中。我只是用它计算它:

<% comment_vote_count = current_user.comments.map{|c| c.votes.count}.sum
   comment_vote_count ||=0 
   comment_vote_count *= 2
   total_vote_count = comment_vote_count + current_user.base_score %>

base_score充当可以手动更改的锚点。

我想在评分机制上添加一些内容。我想为他们邀请的每个实际接受邀请并注册的用户的任何给定用户添加10分。

因此,用于计算用户业力的新逻辑应该是,评论时收到的投票数为2,每个成功邀请加上10分,加上基本分数。

更重要的是如何将其保存在数据库中?我想在users表中添加一个名为score的列。但是如何让它更新呢?每次用户加载他们的个人资料时,我是否让控制器更新它?

1 个答案:

答案 0 :(得分:1)

这是一个简单的计划。首先,在score表中添加users列。

User模型中:

after_invitation_accepted :increment_score_of_inviter

def increment_score_of_inviter
  invitation_by.increment!(:score, 10)
end

def comment_vote_count
  Vote.find(comment_ids).count * 2
end

def calculated_vote_count
  base_score + comment_vote_count
end

def recalculate_score!
  update_attribute(:score, calculated_vote_count)
end

请参阅devise's invitation callbacks about after_invitation_accepted

如果您有大量投票活动,这可能效率很低,但要更新score列,请将其添加到您的Vote模型中:

after_create :increment_user_score

def increment_user_score
  user.increment!(:score, 2)
end

此处的另一种选择是定期重新计算score列,可能使用whenever gem:

every :hour do
  User.find_each { |u| u.recalculate_score! }
end