行未使用变量中的数据呈现,但使用数组数据呈现

时间:2018-07-20 08:51:22

标签: ruby-on-rails highcharts

我有一个用Highcharts渲染折线图的方法。图中的数据是avg_rates变量中的数组,具有以下值:

[0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0, 0, 0, 0, 0, 0]

当我使用变量时,它不会渲染该行:

f.series(
  name: "Average rates",
  data: avg_rates
)

当我使用数组时,它会渲染线:

f.series(
  name: "Average rates",
  data: [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0, 0, 0, 0, 0, 0]
)

我不知道为什么会这样吗?这是完整的方法:

def create_avg_rates_chart(avg_rates)
    months = ['jan','feb','mar','apr','mei','jun','jul','aug','sep','okt','nov', 'dec']
    min = avg_rates[0] - 5
    max = avg_rates[0] + 5

    avg_rates_chart = LazyHighCharts::HighChart.new('graph') do |f|
      f.chart(type: 'line', height: '150', width: '1000')
      f.pane(size: '100%')
      f.colors(['#0092C9'])
      f.xAxis(
        categories: months.map{ |m| [m] },
        labels: {
          style: { "fontSize": "12px" }
        }
      )
      f.yAxis(
        title: {
            text: 0
        },
        min: min,
        max: max
      )
      f.plotOptions(
        line: {
          dataLabels: {
              enabled: true,
              padding: 10
          },
          enableMouseTracking: false,
          lineWidth: 4,
          marker: {
            radius: 5
          }
        }
      )
      f.series(
        name: "Average rates",
        data: avg_rates
      )
      f.legend(enabled: false)
    end
  end

1 个答案:

答案 0 :(得分:1)

最有可能发生这种情况的原因是,当您从数组变量中复制内容时,您不会复制实际对象,而只是复制了控制台表示形式(也就是#inspect的结果)。

数组avg_rates最有可能包含BigDecimal

# avg_rates comes in from outside the function, the line below is a mock.
avg_rates = %w[89.36 89.01 90.15 90.43 89.94 91.05 0 0 0 0 0 0].map(&:to_d)

这些值在控制台中使用#inspect方法表示,并产生以下可视输出:

#=> [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

此可视输出也是完全有效的Ruby代码。但是,如果在控制台中键入0.8936e2,则将实例化Float而不是BigDecimal。如果只看输入数组表示形式的返回值,就可以看出这一点:

avg_rates_repr = [0.8936e2, 0.8901e2, 0.9015e2, 0.9043e2, 0.8994e2, 0.9105e2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
#=> [89.36, 89.01, 90.15, 90.43, 89.94, 91.05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

avg_rates.map(&:class).uniq
#=> [BigDecimal]
avg_rates_repr.map(&:class).uniq
#=> [Float]

正如您所说,使用avg_rates变量时图形不会呈现,但是复制表示时会呈现。这意味着LazyHighCharts::HighChart不接受BigDecimal,但接受Float。因此,您的解决方案应该是将值转换为Float,然后再将其传递给:data的{​​{1}}选项。

#series