带有数组作为属性的Ruby模型

时间:2010-08-09 09:43:59

标签: ruby-on-rails ruby arrays hash modeling

我目前正在尝试实施一个模型来简化图表图表的创建。但是,其中一个属性必须是属性数组。例如:

“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 个答案:

答案 0 :(得分: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 = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000", 
   [ { "Q1" => 220}, {"Q2" => 280}, {"Q3" => 123}, {"Q4" => 200}]
)

图表的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

答案 1 :(得分:0)

假设您打算使用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

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

答案 2 :(得分:0)

你尝试这样的事情

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

类用户  User.class_exec {    %w [姓名年龄地址] .each {| i |       attr_accessor我是    }  } 端

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

您可以将其用作

a = User.new a.name =“sameera” a.age =“29” a.address =“家乡” 把a.inspect

希望这会有所帮助

欢呼声 sameera