代码之家  ›  专栏  ›  技术社区  ›  jalagrange

以数组作为属性的Ruby模型

  •  3
  • jalagrange  · 技术社区  · 16 年前

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

    “Chart_Series”有一个字符串“name”和一个数据字段,数据字段由日期分隔,日期是数组[[Date1,Value1]、[Date2,Value2]、[Date3,Value3]的数组。

    其目的是创建一个“Chart\u 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 回复  |  直到 13 年前
        1
  •  4
  •   Steve Weet    16 年前

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

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

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

      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
    
        2
  •  0
  •   bjg    16 年前

    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

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

        3
  •  0
  •   sameera207    16 年前

    你试试这样的

    类用户 %w[姓名年龄地址]。每个{i| 属性存取器i
    } }

    这将创建一个具有属性的用户类 姓名、年龄和地址

    你可以把它当作

    a=User.new a、 name=“萨米拉” a、 年龄=“29” a、 address=“家乡” 检查

    希望这有帮助

    萨米拉