Как построить двумерные массивы из запроса? - PullRequest
0 голосов
/ 09 января 2012

У меня есть запрос в Rails, который извлекает 3 точки данных: data1, data2 и datetime. Мне нужно собрать их в два разных 2D-массива для вставки в график (Highcharts), например: http://jsfiddle.net/RKVgx/

Вы можете видеть, что данные в конечном итоге будут использоваться в js как:

series: [{
    data: [[6, 540], [7, 540], [7, 1620], [8, 1620]]
},{
    data: [[6, 340], [7, 340], [7, 620], [8, 620]]
}]

Используя lazy_high_charts , это довольно просто, однако мне просто нужно правильно составить массивы для вывода. Я думал, что-то вроде этого, но мне нужна помощь в правильном построении 2D-массивов для вставки:

readings = ModelName.order("date DESC").select('table_name.data1, table_name.data2, table_name.date').limit(1000).all

# HELP HERE, Need 2D arrays here...
data2_and_time_array = Array.new
data1_and_time_array = Array.new

readings.each do |row|
  # HELP HERE, build place datetime into each for X axis
  data1_and_time_array.push row[:date]
  data2_and_time_array.push row[:date]

  # These are the Y data points in each series
  data1_and_time_array.push row[:data2].to_f
  data2_and_time_array.push row[:data1].to_f

end


f.series(
    :name => 'Data1',
    # Date is X & must be first in each 2D array, I believe
    # in format of: [[X1, Y1], [X2, Y2], ... [Xn, Yn]]
    :data => data1_and_time_array 
)
f.series(
    :name => 'Data2',
    :data => data2_and_time_array
)

Если бы вы могли предоставить соответствующие исправления / логику, чтобы сделать это правильно в приведенном выше примере кода, я был бы очень признателен.

1 Ответ

0 голосов
/ 09 января 2012

Не уверен, что я хорошо понимаю, что вы хотите, но map должно сработать:

data2_and_time_array = readings.map{|row| [row.date, row.data1.to_f] }
data1_and_time_array = readings.map{|row| [row.date, row.data2.to_f] }

РЕДАКТИРОВАТЬ:

вы можете выполнить любую обработку внутри блока:

data2_and_time_array = readings.map do{|row| [row.date, row.data1 == -1 ? row.data1.to_f : nil] } 

при выполнении сложной обработки рекомендуется использовать блочный синтаксис do...end для более удобочитаемого кода:

data2_and_time_array = readings.map do |row| 
  date, data = row.date, row.data1
  data = (data == -1) ? nil : data.to_f
  [date, data]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...