Railsのdb:seedでcsvからデータをimportするやつ

を書いた。(db/seeds.rb)
あとはテーブル名.csvみたいなCSVファイルをseeds_dirに置けばrake db:seedでimportできる、というメモ。

seeds_dir  = "#{Rails.root}/db/seeds/#{Rails.env}"

csv_files = Dir.entries(seeds_dir).select {|f| f =~ /\.csv$/ }
csv_files.each do |csv_file|
  p "#{csv_file} from csv"

  model_name = File.basename(csv_file, '.csv')
  model      = model_name.classify.constantize

  path = "#{seeds_dir}/#{csv_file}"
  csv  = CSV.read(path, headers: true, converters: :numeric)
  ActiveRecord::Base.transaction do
    csv.each do |row|
      # idが重複するレコードがある場合はupdate
      if row.has_key?('id')
        record = model.where(id: row['id']).first
        if record.present?
          record.update(row.to_hash)
          next
        end
      end

      model.create(row.to_hash)
    end
  end
end