2010-08-09 1 views
3

В настоящее время я пытаюсь реализовать модель, упрощающую создание графических диаграмм. Однако один из атрибутов должен быть массивом атрибутов. Например:Ruby модель с массивом как атрибут

«Chart_Series» имеет «имя», которое будет представлять собой строку и поле данных, которые будут разделены датами, которые представляют собой массив массивов [[Date1, Value1], [Date2, Value2], [ Date3, Value3].

Цель состоит в том, чтобы создать массив «Chart_Series» так, чтобы позвонить на что-то вроде:

for series in @chart_series 
    series.name 
    for data in series.data 
     data.[Date, Value] 
    end  
end 

, который будет делать что-то вдоль линий:

Name1 
     Date1, Value1 
     Date2, Value 2, 
     Date3, Value 3, 
     Date4, Value 4, 
    Name2 
     Date1, Value 1, 
     Date2, Value 2, 
     Date3, Value 3, 
     Date4, Value 4, 

Это не совсем нужный код .. Мне интересно просто создать модель, которая могла бы сделать что-то вроде этого. Подсказка:

ответ

4

Я вижу два исходных подходов, а именно определить класс для представления вашего ключа, пары значений или просто использовать хэш для представления каждого элемента данных. Преимущество отдельного класса состоит в том, что вы можете продлить его в будущем, если, например, вы хотели бы предоставить точное значение в диаграмме, где вы округлились до ближайших 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 
+0

Спасибо, Стив, я считаю, что ты прибил его. Я использую javascript-библиотеку highcharts. Таким образом, с этими классами создание этих диаграмм будет намного проще – jalagrange

0

Предполагая, что вы намерены использовать реляционную базу данных с ActiveRecord, тогда я верю, что вам нужны (по крайней мере) две модели. Что-то вроде этого:

class Chart < ActiveRecord::Base 
    has_many :data_points 
end 

class DataPoint < ActiveRecord::Base 
    belongs_to :chart 
end 

Ваша Chart модель будет иметь атрибут name и DataPoint модель будет иметь атрибуты date и value.

Тогда вы можете ссылаться на пункты ваших данных, как ассоциация, как это:

@chart.data_points

так это выглядит как атрибут массива, несмотря на то, что ассоциация с другой моделью

+0

Это хорошая идея, но я не использую базы данных для этой конкретной модели, так как эта модель будет заполнена запросом огромной базы данных, и мой интерес - это нарисовать ее. Я сейчас что-то пробовал с хэшами ... Il repost, если у меня есть прорыв ... Спасибо! – jalagrange

+0

Хорошо, я неправильно понял. Если вам не нужна серия, которая будет постоянным атрибутом «Chart», тогда просто создайте массив или хэш как атрибут класса, и вам должно быть хорошо идти. – bjg

0

You попробуйте что-то вроде этого

Скажем, у вас есть класс под названием «Пользователь», и вам нужно динамически генерировать его атрибуты, вы можете сделать это вот так:

класс Пользователь User.class_exec { % w [name age address] .each {| i | attr_accessor я
}} конец

это создаст класс пользователя с атрибутами имя, возраст и адрес

, и вы можете использовать это как

а = User.new а. Name = "Самира" a.age = "29" a.address = "родной город" путы a.inspect

надеется, что это помогает

приветствий Sameera

 Смежные вопросы

  • Нет связанных вопросов^_^