如何从给定的属性动态创建和对象?

时间:2013-10-25 22:38:04

标签: ruby-on-rails ruby excel import

我有一个excel文件导入程序。我想从excel表导入记录,其中列名具有属性名称。

class DDImporter
  def initialize(path)
    @path = path 
  end

  def extract sheet_name
    file = Roo::Excelx.new(@path)
    file.default_sheet = sheet_name

    header = file.row 1
    2.upto(file.last_row) do |i|
      row = Hash[[header, file.row(i)].transpose]
      row.delete "id"
      # row => ['name', 'price', 'product_id']
      sheet_name.classify.constantize.where(name: row['name']).first_or_create # I need to put attributes hash here
    end
  end
end

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,我认为您可以使用Struct来实现您的目标。

self.class.const_set(sheet_name.classify, Struct.new(*header.map(&:to_sym)))

将创建一个名为sheet_name的类w /为所有标头值定义的访问器。假设sheet_namefoo,您可以这样做:

Foo.new(*row)

所有在一起:

header =  ['name', 'price', 'product_id']
row = ['blah', 123, 234]
sheet_name = 'foo'
Object.const_set(sheet_name.classify, Struct.new(*header.map(&:to_sym))) #=> Foo
Foo.new(*row) #=> #<struct Foo name="blah", price=123, product_id=234>

请注意,上面使用了b / c self.class,此对象将在其父对象下命名。你总是可以在Object上调用它,如果这不是你想要的那样