0

国というテーブルを csv ファイルからシードしようとしています。他のシードは指定した順序で機能していますが、これは csv ファイルのフィールドに適切にマップされないアルファベット順に INSERT ステートメントを生成しています。表 countries には主キー制約がありますが、順序またはデフォルト値はありません。スキーマがうまくいかなかった場合に備えて、 rake db:schema:dump も呼び出しました。何か案は?

モデル

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

種.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)
4

2 に答える 2

0

国オブジェクトの作成をコメントアウトし、取得している値が正しいことを最初に確認することをお勧めします。サンプル ファイルを使用し、同様のコードで実行しました。エラーはありません。しかし、異なる順序で値を取得しているため (たとえば、省略形ではなく名前を取得している可能性があるため、エラーが発生します)。最初に、このファイルを読み取って値を出力する単純な ruby​​ スクリプトを作成することもできます。次に、csv ファイルからデータを処理するための標準的な ruby​​ モジュールであるcsv モジュールを使用できます。

于 2013-03-16T03:09:04.887 に答える
0

私にとって、この問題により、マシンまたはレールのインスタンスが非常に悪い状態になりました。Railsサーバーだけでなく、マシン全体を再起動する必要がありました。

于 2013-03-15T13:10:10.663 に答える