Я использую 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
... все еще появляется эта ошибка:
