2013-10-25 3 views
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 

ответ

0

Если я правильно понимаю ваш вопрос, я думаю, вы могли бы использовать Struct, чтобы добиться того, что вы ищете.

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

будет создать класс с именем sheet_name ж/аксессорах, определенные для всех значений заголовков. Так предполагая 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> 

Обратите внимание, что б/с self.class используется выше, этот объект будет пространство имен под своим родителем. Вы всегда можете позвонить по номеру Object, если это не то, что вы хотите

Смежные вопросы