2013-03-15 2 views
0

Я пытаюсь высевать таблицу, названную странами из файла csv. Другие семена работают в том порядке, который я указываю, но он генерирует инструкцию INSERT в алфавитном порядке, которая не корректно отображает поля в файле csv. Страны таблицы имеют ограничение первичного ключа, но не имеют последовательности или значения по умолчанию. Я назвал rake db: schema: дамп также, если схема была не в порядке, не повезло. Есть идеи?rails seed неправильный номер столбца

Модель

class Country < ActiveRecord::Base 
    attr_accessible :id, :name, :abbreviation, :area, :population, :internet_users, :last_updated 
end 

schema.rb

create_table "countries", :id => false, :force => true do |t| 
    t.integer "id",       :null => false 
    t.string "name",   :limit => 50, :null => false 
    t.string "abbreviation", :limit => 5, :null => false 
    t.integer "area" 
    t.integer "population" 
    t.integer "internet_users" 
    t.datetime "last_updated" 
    end 

Образец CSV

1,Afghanistan,AF,"645,807","30,419,928","1,520,996",6/12/2013 
2,Albania,AL,"28,748","2,986,952","1,441,928",12/11/2013 
3,Algeria,DZ,"2,381,741","34,586,184","4,700,000",6/10/2013 
4,American Samoa,AS,197,"67,242","3,040",3/11/2013 

seeds.rb

@seedfilepath = "#{Rails.root}/db/seedfiles/" 
Country.delete_all 
open(@seedfilepath + "countries.csv") do |records| 
    records.read.each_line do |record| 
    id, name, abbreviation, area, population, internet_users, last_updated = record.chomp.split(',') 
    @country = Country.create!(id: id, name: name, abbreviation: abbreviation, area: area, population: population, internet_users: internet_users, last_updated: last_updated) 
    end 
end 

Ошибка

$ rake db:seed 
rake aborted! 
PG::Error: ERROR: value too long for type character varying(5) 
: INSERT INTO "countries" ("abbreviation", "area", "id", "internet_users", "last_updated", "name", "population") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" 
C:/Users/mmoore/Documents/rubyapps/visitdays/db/seeds.rb:14:in `block (2 levels) in <top (required)>' 
C:/Users/mmoore/Documents/rubyapps/visitdays/db/seeds.rb:12:in `each_line' 
C:/Users/mmoore/Documents/rubyapps/visitdays/db/seeds.rb:12:in `block in <top (required)>' 
C:/Users/mmoore/Documents/rubyapps/visitdays/db/seeds.rb:11:in `<top (required)>' 
Tasks: TOP => db:seed 
(See full trace by running task with --trace) 

ответ

0

Я предлагаю вам прокомментировать создание объектов страны и сначала проверить, что значения, которые вы получаете, верны. Я использовал ваш образец файла и запускал его с похожим кодом, как ваш. Ошибок нет. Но так как вы получаете значения в другом порядке (например, вы можете получать имя вместо аббревиатуры - отсюда и ошибка). Вы даже можете написать простой рубиновый скрипт, который читает этот файл и печатает значения. И, во-вторых, вы можете использовать csv module, который является стандартным рубиновым модулем для обработки данных из файла csv.

0

Для меня этот вопрос оставил машину или рельсы экземпляр в очень плохом состоянии. Мне пришлось перезагрузить всю машину, а не только сервер рельсов.

Смежные вопросы