1

我正在建立一个联赛系统,目前它根据结果存储和更新玩家的“elo score”。现在,我正在尝试添加“HighCharts”,以用漂亮的折线图显示本赛季球员的 elo 得分。有人建议我使用 Papertrail 来存储更新,我已经安装好了。

现在我的问题来了,我似乎无法弄清楚如何在一个易于“HighCharts”使用的数组中吐出用户 elo_score 版本。我可以获得 elo_score 的最新更新:

Last updated score = <%= @player.versions.last.reify.elo_score %> 

但我似乎找不到为“elo_score”吐出所有“版本”的语法。类似于“1000、1020、1043、1020”。

我也试过:

<%= @player.versions.map { |version| version.reify.elo_score} %>

但这给了我“nil:NilClass 的未定义方法 `elo_score'”。虽然只是 <%= @player.versions.map { |version| version.reify %> 吐出记录中的所有信息,显然不仅仅是 elo_score。

任何人都可以帮忙吗?抱歉,如果我没有说清楚,我对 Rails 绝对是全新的,这只是我业余时间的一个有趣的项目,但我玩得很开心!

非常感谢!

4

2 回答 2

4

你在这里做了什么:

@player.versions.map { |version| version.reify.elo_score }

将所有这些分数放在一个数组中是完全可以的。你得到的问题(nil:NilClass东西)来了,因为至少有一个reify是零。也就是说,某些版本没有具体化。

如果每个版本都应该有一个 reify,请务必将其添加为模型验证,并在您的代码中找到设置 reify 的位置并查看它为什么为零。

如果一个版本可以使用 nil reify,您可以通过多种方式完成它,但直接和明确的方式如下所示:

elo_scores = []
@player.versions.each do |version|
    unless version.reify.nil?
        elo_scores << version.reify.elo_score
    end
end

我建议将其放入方法中,例如get_elo_scores,然后您可以更轻松地调用它:

@player.get_elo_scores

编辑为了澄清评论:

您的 User 模型(或 Player 模型,无论您如何命名)应该具有如下所示的方法:

def get_elo_scores
    elo_scores = []
    self.versions.each do |version|
        unless version.reify.nil?
            elo_scores << version.reify.elo_score
        end
    end
    return elo_scores
end

我很抱歉没有让这一点更清楚,但您将无法@player在此方法中访问,因为它仅存在于您的控制器和视图的上下文中。上面现在是一个适当的实例方法:它会调用.versions自己,其余的都很好。我还在最后添加了一个明确的返回调用。

现在您将能够调用@player.get_elo_scores任何用户(或播放器)对象。

希望有帮助!

于 2012-05-18T13:07:31.230 回答
0

这是@MrDanA 答案的单行版本:

elo_scores = self.versions.map{|version| version.reify.elo_scores}

请注意,您无法检查version.reify.nil?是否

于 2020-07-29T12:17:52.503 回答