0

我有一个名为“hack”的模型,它可以有许多“序列”。每个“系列”可以有许多“观察”。“观察”是图表数据(例如日期和值所在的位置)。我希望能够创建一个单一的黑客图表,该图表可以具有可变数量的连续剧,每个连续剧都包含“观察”中图表的值。

我的 hack 控制器的“显示”操作如下所示:

def show
  @hack = Hack.find(params[:id])
  @obj = {}
  @hack.serials.each do |s|
    @obj[:name] = s.series_name
    data = s.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '')
    @obj[:data] = data
  end
end

show.html.erb 文件如下所示:

<div id="container" style="height: 500px; min-width: 500px"></div>

<script>
$(function() {
  // Create the chart
  window.chart = new Highcharts.StockChart({
    chart : {
      renderTo : 'container'
    },
    series : 
      <%= raw @obj.to_json %>
    });
});
</script>   

运行此代码时,图表显示“无效日期”。我知道数据是正确的,因为 Highstocks 在我使用单个数据系列时会正确生成图表。在这种情况下,hack 控制器的显示动作是:

def show
  @hack = Hack.find(params[:id])
end

使用 show.html.erb 文件为:

<div id="container" style="height: 500px; min-width: 500px"></div>

<script>
$(function() {
  // Create the chart
  window.chart = new Highcharts.StockChart({
    chart : {
      renderTo : 'container'
    },
    series : [{
      name: 'first',
      data: <%= raw @serial.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '') %>
            }]
   });
 });
 </script>  

我的问题是如何将 n 个连续剧(n = 特定黑客中的连续剧数)添加到 Rails 的 Highstocks 图表中?

4

2 回答 2

1

好的,所以如果我理解正确,您希望每个序列在一个图表中显示为自己的线。我不知道 Ruby on Rails,所以我要在这里“评论”代码。

基本概念是每个系列都应该是系列列表中自己的系列{}。

def show
  @hack = Hack.find(params[:id])
  @objs = []
  @hack.serials.each do |s|
    @obj = {}
    @obj[:name] = s.series_name
    data = s.observations.order("id asc").map{|x| [x.hs_date, x.value]}.to_s.gsub('"', '')
    @obj[:data] = data
    @objs APPEND THE NEW @obj
  end
end

然后在新数组to_json的内部使用:eval@objs

var d = eval('<%= raw @objs.to_json %>');

完成后,您必须查看字符串数组以将它们转换为 javascript 数组,然后您可以将“d”作为系列的值传递。

for (var i=0;i<d.length;i++){
   d[i]['data'] = eval(d[i]['data']);   
}

这是一个展示这个概念的JSFiddle 。

于 2013-03-11T15:04:18.107 回答
0

使用to_json所以它更具可读性

series: <%= @serials.to_json %>

在你的控制器中,@serials

@serials = []
@hack.serials.each do |s|
  s.observations.each do |o|
    @serials << [o.hs_date, o.value]
  end
end
于 2013-03-11T14:49:49.357 回答