我有一个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
答案 0 :(得分:0)
如果我正确理解您的问题,我认为您可以使用Struct
来实现您的目标。
self.class.const_set(sheet_name.classify, Struct.new(*header.map(&:to_sym)))
将创建一个名为sheet_name
的类w /为所有标头值定义的访问器。假设sheet_name
为foo
,您可以这样做:
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
上调用它,如果这不是你想要的那样