2013-03-11 56 views
0

我有一個叫做'hack'的模型,可以有很多'連續'。每個「序列」可以有很多「觀察」。 '觀察'是圖表數據(例如日期和值)的位置。我希望能夠創建一個可以包含可變數量連續字符的單一黑客圖表,其中每個連字符都包含「觀察」中圖表的值。Highstocks添加n個系列的圖表在軌道上

我的黑客控制的「秀」的行動看起來是這樣的:

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在我使用單個數據系列時正確生成圖表。在這種情況下,黑客控制器的顯示操作是:

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 =數量連續劇在一個特定的黑客從軌道Highstocks圖?

+0

整個連續劇,黑客等稍微難以遵循,但是一個「串行」等同於圖中的一個「行」? – MatthewKremer 2013-03-11 14:49:37

+0

@MatthewKremer,是的。序列可以是「美國國內生產總值」,其中觀察值是給定日期範圍內的國內生產總值的實際值。 – JohnGalt 2013-03-11 14:59:14

回答

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_jsoneval@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

+0

我希望每個hack能夠在同一個圖表中處理多個系列。因此,如果一個hack1有三個系列,它會生成一個比較這三個系列的圖表,如果hack2有兩個系列,它會生成一個比較這兩個系列的圖表等。 – JohnGalt 2013-03-11 15:10:24

+0

正確,抱歉,如果我的第一句話錯了,這個解決方案應該爲你工作。你可以嘗試一下,讓我知道嗎?您希望每個序列都是名稱和數據在列表中的{}。所以你最終會得到[{name:'Test',data:stuff},{name:'Test 2',data:stuff}]。 – MatthewKremer 2013-03-11 15:28:06

+0

我仍然從Highstocks得到無效日期。以下是部分通過視圖源呈現的內容:系列: [{「name」:「AFEXPND」,「data」:「[[ - 1293840000000,2.6],[-1262304000000,2.7],[-1230768000000,4.0], – JohnGalt 2013-03-11 15:47:08

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 
+0

首先感謝您的回覆。當我使用你的片段時,我在控制檯'Uncaught SyntaxError:Unexpected token&'中收到以下錯誤。 Rails像數據一樣包裝,如[[" -1293840000000 "," 2.6 "]。爲了對抗我使用'系列:<%= raw @ serials.to_json%>',但是我得到了無效日期的原始錯誤。最後,我需要在每個系列之前插入:name鍵,以便我可以引用每個系列。 – JohnGalt 2013-03-11 15:07:28