У меня есть файл csv с данными дампа таблицы, и я хотел бы импортировать его непосредственно в свою базу данных с помощью рельсов.
В настоящее время у меня есть этот код:
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
, по умолчанию автоматически равны нулю и выдают ошибку, поскольку столбец created_at не может быть нулевым...
Можно ли как-нибудь сделать это общим способом для импорта из csv в модели? или мне придется писать собственный код для каждой модели, чтобы вручную управлять атрибутами в каждой строке??