0

多くの「シリアル」を持つことができる「ハック」と呼ばれるモデルがあります。各「シリアル」には、多くの「観測」を含めることができます。'observations' は、チャート データ (たとえば、日付と値が存在する場所) です。可変数のシリアルを持つことができる単一のハックのチャートを作成できるようにしたいと考えています。各シリアルには、「観察」内のチャートの値が含まれています。

私のハックコントローラーの「表示」アクションは次のようになります。

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 がチャートを正しく生成するため、データが正しいことはわかっています。その場合、ハック コントローラーの show アクションは次のようになります。

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>  

私の質問は、レールから Highstocks チャートに特定のハックのシリアルの数を n として、n 個のシリアルを追加する方法です。

4

2 に答える 2

1

私がこれを正しく理解していれば、各シリアルを 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 配列に変換する必要があります。その後、series の値として「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 に答える