将csv列映射到模型?

时间:2017-06-28 18:43:43

标签: ruby-on-rails ruby csv model mapping

我正在创建一个学生数据库,并使用以下代码读取带有标题的csv文件,并将每个非标题行存储为学生对象。

class Student < ApplicationRecord
     def self.import(file)
          CSV.foreach(file.path, headers: true) do |row|
                Student.create! row.to_hash
          end
     end
end 

我的问题是我需要导入的csv文件可以是不同的格式。有些可能有标题组织如下:

非本科专业|名字|姓氏|上课年份|本科辅修

First_name | Last_name |专业|轻微

First_name | Last_name | Class_year

正如您所看到的,并非所有字段都可能存在,并且它们肯定可能不是相同的顺序。我怎么处理这个?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作来映射具有属性的列:

MAP = {
  "Undegraduate Major" => :major,
  "First Name" => :first_name,
  "Last Name" => :last_name,
  "Class Year" => :class_year,
  "Undergraduate Minor" => :minor,
  "Major" => :major,
  "Minor" => :minor,
  "Class_year" => :class_year
}

CSV.foreach(file.path, headers: true) do |row|
  data = {}

  row.to_hash.each do |k, v|
    key = MAP[k]
    data[key] = v
  end

  Student.create! data
end