Я вижу два исходных подходов, а именно определить класс для представления вашего ключа, пары значений или просто использовать хэш для представления каждого элемента данных. Преимущество отдельного класса состоит в том, что вы можете продлить его в будущем, если, например, вы хотели бы предоставить точное значение в диаграмме, где вы округлились до ближайших 100k.
Следующий код показывает три класса, которые вместе будут делать то, что вы хотите
class Chart
attr_accessor :title, :series
def initialize(title = nil, series = [])
@title, @series = title, series
end
def show
puts title
@series.each do |ser|
puts "\t#{ser.legend} (#{ser.units})"
ser.data.each do |item|
puts "\t\t#{item}"
end
end
end
end
class Series
attr_accessor :legend, :units, :data
def initialize(legend = nil, units = nil, data = [])
@legend, @units, @data = legend, units, data
end
end
class DataItem
attr_accessor :key, :value
def initialize(key, value)
@key, @value = key, value
end
def to_s
"#{key}, #{value}"
end
end
Запуск это следующим образом: -
c = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000",
[ DataItem.new("Q1", 220),
DataItem.new("Q2", 280),
DataItem.new("Q3", 123),
DataItem.new("Q4", 200)]
)
c.series << Series.new("Humbugs", "£000",
[ DataItem.new("Q1", 213),
DataItem.new("Q2", 254),
DataItem.new("Q3", 189),
DataItem.new("Q4", 221)]
)
c.show
Производит следующий вывод
Sweet sales by Quarter
Bon-Bons (£000)
Q1, 220
Q2, 280
Q3, 123
Q4, 200
Humbugs (£000)
Q1, 213
Q2, 254
Q3, 189
Q4, 221
Если вы хотел принять подход Hash, тогда вам больше не понадобится класс DataItem, и вы c ульд экземпляр новой серии с кодом, как этот
c = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000",
[ { "Q1" => 220}, {"Q2" => 280}, {"Q3" => 123}, {"Q4" => 200}]
)
В шоу метод Chart будет выглядеть следующим образом
def show
puts title
@series.each do |ser|
puts "\t#{ser.legend} (#{ser.units})"
ser.data.each do |item|
item.each_pair {|key, value| puts "\t\t#{key}, #{value}" }
end
end
end
Спасибо, Стив, я считаю, что ты прибил его. Я использую javascript-библиотеку highcharts. Таким образом, с этими классами создание этих диаграмм будет намного проще – jalagrange