Импорт Rails из csv в модель

У меня есть файл 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 в модели? или мне придется писать собственный код для каждой модели, чтобы вручную управлять атрибутами в каждой строке??


person Rahul garg    schedule 12.04.2012    source источник


Ответы (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 для даты.

person Siwei    schedule 12.04.2012
comment
1: да, назначен «id», я просмотрел каждый stmt с помощью консоли rails... 2: в миграции rails, если по умолчанию указаны t.timestamps для таблицы, он автоматически генерирует столбцы created,updated_at с этим значением по умолчанию, а не null в SQL - person Rahul garg; 12.04.2012

предоставление таких полей, как «id» и для полей временных меток, тоже решило это вручную...

model.id = row[:id]

и аналогичные для created_at,updated_at, если они существуют в модели..

person Rahul garg    schedule 17.04.2012