2012-04-12 85 views
0

我有一個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 

here幫助..

考慮我的樣本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 

但與此代碼的問題是:

  • It正在生成`id'作爲自動增量1,2,3,..而不是在 csv文件中。
  • 爲那裏是0000-00-00 00:00:00默認爲自動空,拋出錯誤作爲列created_at不能爲空記錄的時間戳...

有什麼辦法,我可以做到這一點在通用的方法來從CSV導入到型號? 或者我將不得不爲每個模型編寫自定義代碼來手動操縱每行中的屬性?

回答

0

提供像「身份證」和時間戳字段太手動解決它領域...

model.id = row[:id] 

和類似的created_at,如果的updated_at這些存在於模型..

1

對於question1,我建議您輸出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」而不是零的日期。

+0

1:是的「身份證」被分配,我已經看着每個stmt與軌道控制檯... 2:在rails的遷移,如果默認指定表t.timestamps,它會自動生成創建,updated_at列與此默認值,而不是在SQL – 2012-04-12 11:03:52