2012-02-15 3 views
0

HighStock Stockchartを設定して、datetimeとvalueの2次元配列を使用しようとしています。この方法はハイチャートのドコでのみ言及され、ハイストックのものには言及されていません。これは私がそれをJavaScriptで表示するとおりに、返される配列であるこの配列をhtml.erbファイルのjavascript関数に渡すには、erbでDate.UTCを評価する必要はありませんか?

def byusers_chart_series(name, byusers) 
      data = [] 
      codes_by_user = byusers.where(:hpmuser => "#{name}").group("date(hpmcreated)").select("date(hpmcreated) as dater, count(globalcode) as codes") 
      codes_by_user.each do |record| 
      #x = [Date.UTC("#{record.dater.year.inspect.to_i}", "#{record.dater.day.inspect.to_i}", "#{record.dater.month.inspect.to_i}"), "#{record.codes.inspect.to_i}"] 
      x = [Date.UTC("#{record.dater.year.inspect.to_i}", "#{record.dater.day.inspect.to_i}", "#{record.dater.month.inspect.to_i}"), "#{record.codes.inspect.to_i}"] 
      data << Array(x) 
      end 

      data 
    end 

私は私のビューヘルパーファイル内のメソッドを持って

[[Date.UTC(2012, 1, 2), 1], 
[Date.UTC(2012, 2, 2), 5], 
[Date.UTC(2012, 3, 2), 15], 
[Date.UTC(2012, 6, 2), 8], 
[Date.UTC(2012, 7, 2), 3], 
[Date.UTC(2012, 8, 2), 73], 
[Date.UTC(2012, 9, 2), 77]] 

そして、これはありますhtml.ERBファイルからコード:

<script type="text/javascript" charset="UTF-8"> 

    $(function() { 
     new Highcharts.StockChart({ 

      chart : { 
       renderTo: 'weeks52dynamic', 
       borderColor: '#EBBA95', 
       borderWidth: 3 
      }, 

      legend : { 
       align : "left", 
       enabled : true, 
       layout : "vertical", 
       verticalAlign : "top" 
      }, 

      rangeSelector : { 
       selected : 0 
      }, 

      title : { 
       text : 'title' 
      }, 

      scrollbar: { 
       barBackgroundColor: 'gray', 
       barBorderRadius: 7, 
       barBorderWidth: 0, 
       buttonBackgroundColor: 'gray', 
       buttonBorderWidth: 0, 
       buttonBorderRadius: 7, 
       trackBackgroundColor: 'none', 
       trackBorderWidth: 1, 
       trackBorderRadius: 8, 
       trackBorderColor: '#CCC' 
      }, 
      xAxis: { 
       title: { 
        text: "Date" 
       }, 

       type: "datetime", 
       dateTimeLabelFormats: { // don't display the dummy year 
      month: '%e. %b', 
      year: '%b' 
     } 

      }, 
      yAxis: { 
       min: 0, 
       title: { 
        text: "Number of Codes" 
       } 


      }, 
      series: [ 
      <% { "New Codes" => Newcode.codesperday }.each do |name, newcodes| %> 
      { 
       name: "<%= name %>", 
       pointInterval: <%= 1.day * 1000 %>, 
       pointStart: <%= 350.weeks.ago.to_i * 1000 %>, 
       data: <%= newcodes_chart_series(newcodes, 350.weeks.ago) %>, 
       marker : { 
        enabled : true, 
        radius: 3 
       } 
      }, 
      <% end %> 
      <% { "User" => Newcode.byuser }.each do |name, byusers| %> 
      { 
       name: "<%= name %>", 
       data: <%= byusers_chart_series(name, byusers) %>, 
       marker : { 
        enabled : true, 
        radius: 3 
       } 
      } 
      <% end %> 
      ] 

     }); 

    }); 


</script> 

私は私のブラウザで取得エラー、私はERBテンプレートがトンだと思いますDate.UTC関数をJavaScriptに渡すのではなく、評価するために実行します。私の問題は、配列または配列のData.UTCの周りに何らかの引用符を置くたびに、引用符が配列の最後の配列に表示され、javascriptに送られます。

どのように私はそれを評価することなく、配列の正確な配列を渡すことができますか?

+0

ワンノート: '"#{recor:あなたはこのコードを持っていますd.dater.year.inspect.to_i} "あなたがしている事は_" Ruby、数字を(年)与えてください。これを文字列に変換します(検査します)。その文字列を数値(to_i)に戻します。その数値を文字列に戻します。(文字列補間 '#{...} 'は、文字列に入れる前に式の結果に対して常に' to_s'を呼び出します。)したがって、整数の場合は、 '#{record.dater.year}' 'という簡単なコードを使用してください。 – Phrogz

+0

私は自分のコードに書いた簡単なテクニックを追加しています。私は.eachを使い、新しい配列をいくつか作成しています。 – holaSenor

+1

私はunique_usersメソッドを使用しています。これにより、DB内のすべてのユーザーが表示されます。 .mapを使って5行から2行にしましたが、rubyは素晴らしいです。 – holaSenor

答えて

2

私たちが修正している間にあなたの方法を簡単にしましょう。

foo = [] 
bar.each{ … foo << jim } 

...、代わりにあなたがこれを使用する必要があります:あなたが今までにこのようなコードで自分自身を見つける場合

foo = bar.map{ … jim } 

あなたはこのコードを実行するためのRubyを必要とし、あなたのルビーコードでDate.UTCを持っていますアレイを構築しています。あなたのビューで

def byusers_chart_series(name, byusers) 
    codes_by_user = byusers.where(:hpmuser => "#{name}").group("date(hpmcreated)").select("date(hpmcreated) as dater, count(globalcode) as codes") 
    codes_by_user.map do |record| 
    parts = %w[year month day].map{ |s| record.dater.send(s) } 
    "[Date.UTC(#{parts.join(',')}),#{record.codes}]" 
    end 
end 

そして:

data: [ <%= byusers_chart_series(name, byusers).join(", ") %> ], 
代わりに配列の配列を作成するので、私たちはあなたの codes_by_userが希望JSコードです の配列に変換する Enumerable#mapを使用します

これはあなたのHTMLに次のような出力を生成します:

data: [ [Date.UTC(2011,10,7),42], [Date.UTC(2012,4,3),17] ], 
+0

ありがとうございました – holaSenor

+0

今、私はJavaScriptを使ってゼロベースの月を計算するために毎月1を減算したいのですが? – holaSenor

+0

@opensourcechris私はそこに置いた小さなDRYマップを削除するか、文字列を構築する前に 'parts [1] - = 1'を追加することができます。 – Phrogz

関連する問題