我在我的rails应用中使用了acts_as_votable和devise_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的列。但是如何让它更新呢?每次用户加载他们的个人资料时,我是否让控制器更新它?
答案 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