Rails4将未知字段导入序列化哈希



我有一个模型,它由几个字段组成,即(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

最新更新