我有一个模型,它由几个字段组成,即(Name,Description)和一个属性列,该列是自定义属性的序列化哈希。
我正在尝试编写一个导入脚本,以处理将CSV/XLS文件导入该模型的数据库,并且正在努力捕获所有未知的数据库字段,并将它们的头作为哈希序列化到属性列中。
(与下表一致)。
名称|描述|字段1|字段2
Row1|这是|Row1F1|Row1F2
Row2|这是|Row2F1|Row2F2
我希望它作为导入数据库
测试模型.create(:name=>Row1,:description=>"This is",:properties=>{:field1=>"Row1F1",:field2=>"Row1F2"})
我当前用于其他简单表的SIMPLE导入如下。我正在使用Roo
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
chemuse = find_by_id(row["id"]) || new
chemuse.attributes = row.to_hash
chemuse.save!
end
end
我的目标是让导入捕获未知的列名,然后将它们放入哈希中,并将它们添加到:properties列中。
所以我找到了以下代码,它很有效,但看起来效率不高,但我想把它作为答案发布。
def self.import(file)
spreadsheet = open_spreadsheet(file)
cn = column_names
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
rawrow = Hash[[header, spreadsheet.row(i)].transpose]
cleansedrow = {:properties => {}}
rawrow.each do |key, value|
if cn.include?(key)
cleansedrow[key] = value
else
cleansedrow[:properties][key] = value
end
end
record = find_by_id(cleansedrow["id"]) || new
record.attributes = cleansedrow.to_hash
record.save!
end
end