1

テーブルのダンプデータを含む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

しかし、このコードの問題は次のとおりです。

  • csvファイルの代わりに自動インクリメント1、2、3、..として「id」を生成しています。
  • 0000-00-00 00:00:00デフォルトで自動的にnullになり、列created_atをnullにできないため、エラーをスローするレコードのタイムスタンプ...

csvからモデルにインポートする一般的な方法でそれを行う方法はありますか?または、各行の属性を手動で操作するために、モデルごとにカスタムコードを作成する必要がありますか?

4

2 に答える 2

2

row.to_hash.symbolize_keys質問1の場合、たとえば、を出力することをお勧めします。

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

「id」が割り当てられているかどうかを確認します。

質問2の場合、日付にnilではなく「0000-00-00」を格納するのは良い考えではないと思います。

于 2012-04-12T10:55:10.933 に答える
0

'id'のようなフィールドを提供し、タイムスタンプフィールドに対しても手動で解決しました...

model.id = row[:id]

これらがモデルに存在する場合、created_at、updated_atについても同様です。

于 2012-04-17T17:35:35.730 に答える