【问题标题】:Using instance methods with chartkick in a rails app在 Rails 应用程序中使用带有 chartkick 的实例方法
【发布时间】:2014-06-27 18:06:37
【问题描述】:

我有一个模型,有一个实例方法 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| {名称:团队名称,点差: team.point_differential}}

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails charts chartkick


    【解决方案1】:

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

    考虑你的第一个例子:

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

    【讨论】:

    • 谢谢!当我注意到哈希数组时,这就是我所走的确切路线。我们同时发帖。谢谢你的一个班轮!
    • 哈没问题!不过,您绝对应该将其包装在您提出的方法中。但是,如果我可以提出建议,请不要将该方法应用于您的模型之一,因为它非常特定于您正在使用的宝石。如果您稍后使用需要不同结构的不同宝石怎么办?考虑一个自定义类/方法,如 ChartHelper.player_point_differentials 或将其放入帮助程序中。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2017-10-01
      相关资源
      最近更新 更多