[英]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.