2

我有一个模型,团队有一个实例方法 point_differential (基本上是点数 - 点数反对)。我正在尝试在 chartkick 图中使用它,但没有运气。

这有效

= bar_chart Team.group(:group).sum(points_for)

因为 points_for 只是 Team 模型的一个属性。

这不是因为 point_differential 是实例方法,而不是属性

= bar_chart Team.group(:name).sum(point_differential)

也没有

= bar_chart Team.group(:name).sum(&:point_differential)

也没有

bar_chart = Team.all.map {|team| {name:team.name, point_differential: team.point_differential}}

有任何想法吗?

4

2 回答 2

4

您的最后一个选项几乎是正确的,但是您的格式错误。

考虑你的第一个例子:

Team.group(:group).sum(:points_for)

这将创建一个如下所示的哈希:

{"Team A" => 14, "Team B" => 9}

在上一个示例中,您这样做了:

Team.all.map {|team| {name:team.name, point_differential: team.point_differential}}

这将创建一个哈希数组,如下所示:

[{:name => "Team A", :point_differential => 14}, {:name => "Team B", :point_differential => 9}]

相反,试试这个:

Hash[ *Team.all.map { |team| [team.name, team.point_differential] }.flatten ]

这是一个深奥的单行程序,它接受一个数组数组(每个 2 个元素),并从中创建一个哈希,给你这样的东西:

{"Team A" => 14, "Team B" => 9 }

像你要的那样。

另一种显示更多步骤的方法是这样的:

hash = {}
Team.all.each do |team|
  hash[team.name] = team.point_differential
end

那么这hash将具有正确的值。

于 2014-06-27T18:45:41.147 回答
1

我通过编写一个类方法来解决这个问题,以使用注入构建哈希

def self.hashify_points_differential
   Player.all.inject({}) do |result, player|
     result[player.name] = player.point_differential
     result
    end   
end

然后我可以像使用它一样

= bar_chart Player.hashify_points_differential
于 2014-06-27T18:47:56.363 回答