繁体   English   中英

在Rails应用程序中将实例方法与Chartkick一起使用

[英]Using instance methods with chartkick in a rails app

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

这有效

= 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}}

有任何想法吗?

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

考虑您的第一个示例:

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将具有正确的值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM