ruby-on-railscsvsqlitesqlite3-ruby

Ruby on rails Unknow attribute when importing csv file to database


I'm trying to import a csv file to a ruby on rails app database. I got this error unknown attribute '2191' for Landslide. when running bundle exec rake db:import_csv. 2191 is the first item on the first row of the csv file.

import_csv.rake

require 'csv'
namespace :db do
  task :import_csv => :environment do
    CSV.foreach("Sample_landslides.csv", :headers => true) do |row|
      Landslide.create!(row.to_hash)
    end
  end
end

schema

  create_table "landslides", force: :cascade do |t|
    t.integer  "total_id"
    t.integer  "year_id"
    t.date     "start_date"
    t.date     "end_date"
    t.integer  "day_number"
    t.string   "continent"
    t.string   "country"
    t.string   "location"
    t.string   "type"
    t.integer  "admin_level"
    t.float    "lat"
    t.float    "lng"
    t.boolean  "mapped"
    t.float    "spatial_area"
    t.integer  "fatalities"
    t.integer  "injuries"
    t.string   "notes"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.string   "trigger"
  end

Solution

  • As per my knowledge if you are using row_to hash your csv headers must match with model attributes.

    require "csv"
    
    HEADER_MAP = {
      "Total" => :total_id,
    }
    
    HEADER_CONVERTER = ->(header) {
      HEADER_MAP.fetch(header, header).to_sym
    }
    
    csv = <<END
     Column1,Column2,EXT:MAT:PIDTC
     100,200,300
     400,500,600
    END
    
    CSV.new(csv, headers: true, header_converters: HEADER_CONVERTER).each do   |row|
      p row.to_hash
    end