0

我有一个 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
4

1 回答 1

0

如果我正确理解您的问题,我认为您可以使用 aStruct来实现您正在寻找的东西。

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

将创建一个名为sheet_namew/ 为所有标头值定义的访问器的类。所以假设 a 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>

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

于 2013-10-25T23:19:54.813 回答