【问题标题】:Get leaderboard to update every time user score updates每次用户得分更新时获取排行榜以更新
【发布时间】:2015-05-07 18:38:04
【问题描述】:

目前我已经设法让leaderboard gem 在我的 Rails 应用程序上工作,但我似乎无法弄清楚如何将用户数据放到它上面。我也不知道如何让它随着用户分数的更新而更新......

我一直关注 this tutorial 试图让它工作,但现在正在努力整合最后一点......

目前我有这样的 Boards update_service.rb:

module Boards
  class UpdateService < Boards::Base
    def execute(user)
      name = user.first_name
      score = user.percentages
      leaderboard.rank_member(name, score)
      member = leaderboard.score_and_rank_for(name)
      member[:page] = leaderboard.page_for(name, leaderboard.page_size)
      member
    end
  end
end

我想现在对所有用户调用此服务(以便他们都根据当前分数进行排名),然后对其进行设置,以便在每次更新用户分数时调用此服务。

我不知道在哪里调用它来获取初始数据...

但是通过在 Rails 控制台中玩耍,我发现这很有效:

update = Boards::UpdateService.new
Student.all.each do |student|
  update.execute(student)
end

为了让它随着用户的分数更新而更新,我认为我应该这样做:

 after_update :update_rank

  def update_rank
    Boards::UpdateService.new
  end

在 User 类中,老实说,我从教程中得到了部分内容,我真的不明白为什么不是这样:

def update_rank
  Boards::UpdateService(user)
end 

但这可能只是因为我真的不太了解发生了什么......

【问题讨论】:

    标签: ruby-on-rails ruby leaderboard


    【解决方案1】:

    因为UpdateService 是一个类,而不是方法名,所以你必须通过调用构造函数UpdateService.new 来创建这个类的一个实例。看看那里有一个execute 方法,考虑按照以下方式做一些事情:

    def update_rank
      update = Boards::UpdateService.new
      update.execute(self)
    end
    

    更新:

    调用execute 将用于初始化,因为它会更新用户的leaderboard(如果存在),如果不存在则创建它。

    要正确初始化它,您应该考虑在创建用户时调用为用户创建排行榜的方法。

    【讨论】:

    • 嗯,好吧,有道理...我会先尝试一下如何获得所有其他用户的分数...
    猜你喜欢
    • 2014-11-13
    • 2010-12-10
    • 2013-06-03
    • 2012-08-04
    • 2020-11-10
    • 2020-06-30
    • 1970-01-01
    • 2017-09-12
    • 2015-03-21
    相关资源
    最近更新 更多