Модель Ruby с массивом в качестве атрибута - PullRequest
3 голосов
/ 09 августа 2010

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

«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,

Это не совсем нужный код. Я заинтересован в простом создании модели, которая могла бы делать что-то подобное. Любая помощь приветствуется

Ответы [ 3 ]

4 голосов
/ 09 августа 2010

Я вижу два начальных подхода, а именно: определить класс для представления вашего ключа, пары значений или просто использовать хеш для представления каждого элемента данных.Преимущество отдельного класса заключается в том, что вы можете расширить его в будущем, если, например, вы хотите указать точное значение в диаграмме, на которой вы округлялись до ближайших 100 тыс.

1002 * В следующем коде показаны три классакоторый вместе будет делать то, что вы хотите
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

Если вы хотите взятьВ этом случае вам больше не понадобится класс DataItem, и вы можете создать новую серию с кодом, подобным этому

c = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000", 
   [ { "Q1" => 220}, {"Q2" => 280}, {"Q3" => 123}, {"Q4" => 200}]
)

Метод show 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 голосов
/ 09 августа 2010

Вы пытаетесь что-то вроде этого

Скажем, у вас есть класс с именем User, и вам нужно динамически генерировать его атрибуты, вы можете сделать это следующим образом,

класс пользователя User.class_exec { % w [имя, возрастной адрес] .each {| i | attr_accessor i
} } конец

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

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

a = User.new a.name = "sameera" a.age = "29" a.address = "родной город" ставит a.inspect

надеюсь, это поможет

веселит Самира

0 голосов
/ 09 августа 2010

Если вы намереваетесь использовать бэкэнд реляционной базы данных с 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...