Rails从csv导入到模型

时间:2012-04-12 10:41:28

标签: ruby-on-rails ruby-on-rails-3 activerecord csv data-import

我有一个包含表的转储数据的csv文件,我想使用rails将它直接导入我的数据库。

我目前正在使用此代码:

csv_text = File.read("public/csv_fetch/#{model.table_name}.csv")
ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{model.table_name}")
puts "\nUpdating table #{model.table_name}"
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
  row = row.to_hash.with_indifferent_access
  ActiveRecord::Base.record_timestamps = false
  model.create!(row.to_hash.symbolize_keys)
end

here ..

的帮助下

考虑我的Sample csv:

id,code,created_at,updated_at,hashcode
10,00001,2012-04-12 06:07:26,2012-04-12 06:07:26,
2,00002,0000-00-00 00:00:00,0000-00-00 00:00:00,temphashcode
13,00007,0000-00-00 00:00:00,0000-00-00 00:00:00,temphashcode
43,00011,0000-00-00 00:00:00,0000-00-00 00:00:00,temphashcode
5,00012,0000-00-00 00:00:00,0000-00-00 00:00:00,temphashcode

但是这段代码的问题是:

  • 它正在生成`id'作为自动增量1,2,3,而不是in csv文件。
  • 0000-00-00 00:00:00的记录的时间戳默认为null并且因为create_at列不能为null而抛出错误...

有什么方法可以用通用的方式从csv导入到模型吗? 或者我是否必须为每个模型编写自定义代码以手动操作每行中的属性?

2 个答案:

答案 0 :(得分:1)

问题1的

,我建议您输出row.to_hash.symbolize_keys,例如

# ...
csv.each do |row|
  #...
  hash = row.to_hash.symbolize_keys
  Rails.logger.info "hash: #{hash.inspect}"
  model.create!(hash)
end

查看是否已分配“id”。

对于Question2,我认为在日期中存储“0000-00-00”而不是nil是个好主意。

答案 1 :(得分:0)

提供“id”等字段和时间戳字段也手动解决了它...

model.id = row[:id]

和created_at类似,如果模型中存在这些,则为updated_at。