带有数组作为属性的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, 

这不完全是所需的代码。我感兴趣的是简单地生成可以做这样的事情的模型。 任何帮助表示赞赏

我可以看到两个初始方法,即定义一个类来表示您的键,值对或只是使用哈希来表示每个数据项。 单独类的优点是您可以在将来扩展它,例如,如果您想要在图表中提供精确值,您将四舍五入到最接近的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 

产生以下输出

季度销售情况良好
     Bon-Bons(£000)
         Q1,220
         Q2,280
         Q3,123
         Q4,200
    骗子(£000)
         Q1,213
         Q2,254
         Q3,189
         Q4,221

如果你想采用Hash方法,那么你将不再需要DataItem类,你可以用这样的代码实例化一个新系列

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

Chart的show方法看起来像这样

  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 

假设您打算使用ActiveRecord的关系数据库后端,那么我相信您需要(至少)两个模型。 像这样的东西:

 class Chart < ActiveRecord::Base has_many :data_points end class DataPoint < ActiveRecord::Base belongs_to :chart end 

您的Chart模型将具有name属性, DataPoint模型将具有datevalue属性。

然后,您可以引用您的数据点作为关联,如下所示:

@chart.data_points

所以它看起来像一个数组属性,即使它是与另一个模型的关联

你尝试这样的事情

假设你有一个名为User的类,你需要动态生成它的属性,你可以这样做,

class User User.class_exec {%w [name age address] .each {| i | attr_accessor i
} } 结束

这将创建一个具有属性名称,年龄和地址的User类

你可以用它作为

a = User.new a.name =“sameera”a.age =“29”a.address =“home town”放置a.inspect

希望这可以帮助

同样欢呼