Rails 5.2: одноразовый импорт CSV в модель завершается неудачно с UnknownAttributeError - PullRequest
0 голосов
/ 20 сентября 2018

Я использую Rails 5.2 в Windows.Я следовал совету @Tom De Leu ( Ruby on Rails - Импорт данных из файла CSV ) для импорта данных CSV в таблицу следующим образом:

task :import_currencies => :environment do

    require 'csv'

    filename = File.join Rails.root, "lib/tasks/forex20sep2018.csv"
    CSV.foreach(filename, :headers => true) do |row|
      Currency.create!(row.to_hash)
    end

end

Сам CSV выглядит следующим образомэто:

code,name,symbol
AED,UAE Dirham,د.إ
ALL,Lek,Lek
AMD,Armenian Dram,Lek
ANG,Netherlands Antillean Guilder,ƒ
...

, но когда я запускаю задачу rake:

rails import_currencies

, она завершается ошибкой:

rails aborted!
ActiveModel::UnknownAttributeError: unknown attribute 'code' for Currency.

Поэтому я изменил свой код следующим образом:

task :import_currencies => :environment do

    require 'csv'

    filename = File.join Rails.root, "lib/tasks/forex20sep2018.csv"
    CSV.foreach(filename, :headers => true) do |row|
        c = Currency.new
        c.code = row[0]
        c.name = row[1]
        c.symbol = row[2]
        c.save
        puts c.errors.full_messages
    end

end

И это отлично работает.Проблема в том, что он не гибкий и не элегантный, поэтому я хотел бы знать, почему оригинальный код не работал.

(FWIW, я попытался изменить заголовок CSV следующим образом:

'code', 'name', 'symbol'
"code", "name", "symbol"
:code, :name, :symbol

Ничего из этого не помогло.)

@ Вишал попросил таблицу:

create_table "currencies", force: :cascade do |t|
  t.string "name"
  t.string "code"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string "symbol"
  t.index ["code"], name: "index_currencies_on_code"
end

После нескольких предложений я только что сделал фиктивный CSV с одной записью:

code,name,symbol
AAA,Dollar,$

и выполнение этого кода:

task :import_currencies_org => :environment do

    require 'csv'    

    filename = File.join Rails.root, "lib/tasks/forex20sep2018dummy.csv"
    CSV.foreach(filename, :headers => true) do |row|
      puts row.to_hash
      Currency.create!(row.to_hash)
    end

end

... все еще появляется эта ошибка:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...