1

我有一个带有表转储数据的 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

在这里的帮助下..

考虑我的示例 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,.. 而不是 csv 文件中的内容。
  • 记录的时间戳0000-00-00 00:00:00自动默认为 null 并引发错误,因为 created_at 列不能为 null ...

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

4

2 回答 2

2

对于问题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”。

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

于 2012-04-12T10:55:10.933 回答
0

提供像'id'这样的字段和时间戳字段也手动解决了它......

model.id = row[:id]

如果模型中存在 created_at、updated_at 则类似。

于 2012-04-17T17:35:35.730 回答