【问题标题】:Saving and updating user karma in the database - rails在数据库中保存和更新用户业力 - rails
【发布时间】:2014-04-16 23:05:03
【问题描述】:

我在我的 Rails 应用程序中使用 acts_as_votabledevise_invitable

用户可以发表评论,并且他们的 cmets 是可投票的。

每个用户都有一个业力/分数

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

<% 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 分。

所以计算用户业力的新逻辑应该是,在 cmets 上获得的票数乘以 2,每次成功邀请加 10 分,再加上基本分数。

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • @KatieH 将scoretotal_vote_count 相同吗?注意increment! 方法。这需要数据库中有一个score 列(整数)。
    • 在这种情况下,您必须在每次有人投票时更新score。根据投票的活动,这可能效率很低。我现在将添加一个示例。另一种更有效的方法是定期重新计算投票并更新score 列,可能使用wheneverrake 任务。
    • 非常感谢!我将使用第一个示例,但是我将如何通过计算的投票数向用户道歉?
    • 我已经更新了答案以包含我的建议。如果您没有很多用户并且有能力将它们加载到数组中,那么您可以即时执行此操作:User.all.sort_by(&amp;:calculated_vote_count)
    • 没问题。您不需要使用user.score,因为这些方法在User 模型中(实例方法)。这意味着您可以完全跳过其中的user。不是为了增加混乱,而是在实例方法中引用user,您可以使用self,如self.commentsself.id等。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多