2016-05-13 12 views
0

、市モデルデータベースにCSVレコードをアップロードしようとしてきエラーUnknownAttributeError CSV

ActiveRecord::UnknownAttributeError in PagesController#import 

unknown attribute 'country ' for City. (City.create! row.to_hash) 

CSV:

name  country general_info1 general_info2 (etc) 
Toronto Canada  This is a test (nil) 

アップロードビュー

<%= form_tag upload_path, multipart: true do %> 
    <%= file_field_tag :file %> 
    <%= submit_tag "import" %> 
<% end %> 

ルート:

post '/upload' => 'pages#import' 

をPagesController

def import 
    City.import(params[:file]) 
end 

市モデル

def self.import(file) 
    logger.info "__________________" 
    logger.info file.inspect 
    logger.info file.path 
    logger.info "__________________" 

    CSV.foreach(file.path, headers: true) do |row| 
     City.create! row.to_hash 
     #puts '&&&&&&&&&&&&&&&&&&&&&&&' + row[1] 
     logger.info row.inspect 
    end 

スキーマ事前に

ActiveRecord::Schema.define(version: 20160513090837) do 

    create_table "cities", force: :cascade do |t| 
    t.string "name" 
    t.string "country" 
    t.string "general_info1" 
    t.string "general_info2" 
    t.integer "happiness_rating" 
    t.integer "family_safety_rating" 
    t.string "family_safety_info" 
    t.integer "bike_hobby_rating" 
    t.string "bike_hobby_info" 
    t.integer "accountant_rating" 
    t.integer "accountant_shortage_rating" 
    t.string "accountant_shortage" 
    t.integer "accountant_avg_salary" 
    t.integer "graphic_designer_rating" 
    t.string "graphic_designer_shortage" 
    t.integer "graphic_designer_avg_salary" 
    t.integer "journalist_rating" 
    t.string "journalist_shortage" 
    t.integer "journalist_avg_salary" 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    end 

end 

多くのおかげ

答え:

Cityそのモデルの create!方法は citiesテーブルが存在しないで存在することが期待されている場合、最初の
+0

のためにこれを参照してくださいheader_converters: :symbol

を使用して...誰かが説明してくださいできますか?ありがとうございました – daveasdf

答えて

0

は、ActiveRecord::UnknownAttributeErrorが生じます。そこに確認してください。

誰かがヘッダーをシンボルにする必要がある理由を教えてください。

ルビーでCSVを解析すると、通常、データはHashのコレクションとして取得されます。次の例では、すべてのHashに対するkeysが繰り返されており、それらがStringデータであることに気付いたことがあります。 Rubyでは、すべてStringのインスタンスは別々のメモリ空間を占有します。

csv.to_a.map {|row| row.to_hash } 
# => [{"Year"=>"1997", "Make"=>"Ford", "Model"=>"E350", "Description"=>"ac, abs, moon", "Price"=>"3000.00"}, {"Year"=>"1999", "Make"=>"Chevy", "Model"=>"Venture \"Extended Edition\"", "Description"=>"", "Price"=>"4900.00"}, {"Year"=>"1999", "Make"=>"Chevy", "Model"=>"Venture \"Extended Edition, Very Large\"", "Description"=>nil, "Price"=>"5000.00"}, {"Year"=>"1996", "Make"=>"Jeep", "Model"=>"Grand Cherokee", "Description"=>"MUST SELL!\nair, moon roof, loaded", "Price"=>"4799.00"}] 

セイ列computer8 bytesを占めています。この文字列を1000,000回定義すると、それは私のRAMの8MBを占有します。

header_converters: :symbolを使用するとto_symメソッドが呼び出され、今度はkeyssymbolと定義されます。

csv = CSV.new(body, :headers => true, :header_converters => :symbol) 
csv.to_a.map {|row| row.to_hash } 
# => [{:year=>"1997", :make=>"Ford", :model=>"E350", :description=>"ac, abs, moon", :price=>"3000.00"}, {:year=>"1999", :make=>"Chevy", :model=>"Venture \"Extended Edition\"", :description=>"", :price=>"4900.00"}, {:year=>"1999", :make=>"Chevy", :model=>"Venture \"Extended Edition, Very Large\"", :description=>nil, :price=>"5000.00"}, {:year=>"1996", :make=>"Jeep", :model=>"Grand Cherokee", :description=>"MUST SELL!\nair, moon roof, loaded", :price=>"4799.00"}] 

シンボルの特長は何ですか?

シンボルはメモリ効率がよく、検索は非常に高速です。シンボル:computer1000,000を定義すると、メモリは8Bytesしか占有しません。

この説明は私の質問にどう対処していますか?

CSVファイルには、数千行のデータがあり、Hashに変換されることがあります。ヘッダは、シンボルにする必要がなぜこれほど速く、このプロセスを作成し、メモリ効率のために、あなたはより多くの情報http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV.html#HeaderConverters

+0

ありがとう!実際には、header_converters::symbolオプションを追加する前に、Cityインスタンスがcsv /データベース変換のためにnilを戻していた、またはUnknownAtrributeErrorを与えていた、ということを忘れてしまいました。私がシンボルオプションを追加したとき、それは魔法のように働いた。 – daveasdf

+0

これまで、私はdef initとattr_accessorをモデルに追加しようとしましたが、同じエラーが発生しました。しかし、あなたはスキーマから見ることができます、私はそこに '国'を持っており、私はそれに応じてCSVを並べ...行[1]は 'カナダ'でした。シンボルオプションは、どういうわけか、適切なモデルでcsvを整列させる必要がありますが、属性とはどのように、なぜ私は知らないのでしょうか。 – daveasdf

+0

iが添加された場合、私はまた #City.create!({[2]、 # #名=>行[0]、 #国=>行[1]、 #general_info1 =>行})試み無駄なattr_accessorsを定義する – daveasdf

関連する問題