2016-09-29 3 views
0

DBのデバイステーブルにdevices.csvファイルのデータをロードしようとしました。エラー:コマンドラインですくいコマンド上記csvファイルをアップロードするためにimport.rakeを実行中に不明な属性エラーが発生しました

rake db:devices RAILS_ENV=production 

を実行している間 はしかし、私は未知の属性を取得しています。

以下は結果トレースです。

** Invoke db:devices (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute db:devices 
rake aborted! 
unknown attribute: 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:88:in `block in assign_attributes' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `each' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `assign_attributes' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/base.rb:498:in `initialize' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/oink-0.10.1/lib/oink/instrumentation/active_record.rb:60:in `initialize' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/persistence.rb:44:in `new' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/activerecord-3.2.13/lib/active_record/persistence.rb:44:in `create' 
/opt/EDDIE/lib/tasks/import.rake:6:in `block (3 levels) in <top (required)>' 
/usr/local/rvm/rubies/ruby-2.0.0-p648/lib/ruby/2.0.0/csv.rb:1719:in `each' 
/usr/local/rvm/rubies/ruby-2.0.0-p648/lib/ruby/2.0.0/csv.rb:1120:in `block in foreach' 
/usr/local/rvm/rubies/ruby-2.0.0-p648/lib/ruby/2.0.0/csv.rb:1266:in `open' 
/usr/local/rvm/rubies/ruby-2.0.0-p648/lib/ruby/2.0.0/csv.rb:1119:in `foreach' 
/opt/EDDIE/lib/tasks/import.rake:5:in `block (2 levels) in <top (required)>' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:236:in `call' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:236:in `block in execute' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:231:in `each' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:231:in `execute' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:175:in `block in invoke_with_call_chain' 
/usr/local/rvm/rubies/ruby-2.0.0-p648/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:168:in `invoke_with_call_chain' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/task.rb:161:in `invoke' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:149:in `invoke_task' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:106:in `block (2 levels) in top_level' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:106:in `each' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:106:in `block in top_level' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:115:in `run_with_threads' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:100:in `top_level' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:78:in `block in run' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/lib/rake/application.rb:75:in `run' 
/usr/local/rvm/gems/ruby-2.0.0-p648/gems/rake-10.1.1/bin/rake:33:in `<top (required)>' 
/usr/local/rvm/gems/ruby-2.0.0-p648/bin/rake:23:in `load' 
/usr/local/rvm/gems/ruby-2.0.0-p648/bin/rake:23:in `<main>' 
/usr/local/rvm/gems/ruby-2.0.0-p648/bin/ruby_executable_hooks:15:in `eval' 
/usr/local/rvm/gems/ruby-2.0.0-p648/bin/ruby_executable_hooks:15:in `<main>' 
Tasks: TOP => db:devices 

ここには、lib/tasksフォルダのrakeファイルがあります。

require 'csv' 
namespace :db do 
    desc "Import devices from csv file" 
    task :devices => [:environment] do 
     CSV.foreach('devices.csv', :headers => true, :encoding => 'ISO-8859-1:UTF-8') do |row| 
     Device.create(row.to_hash) 
    end 
    end 
end 

誰でもこのエラーを無視してDBにデータをロードする方法を教えてください。

+0

が働いて、それを手に入れた:

あなたの例を使用して、それがこのようなものだろうか? –

+0

ありがとうございました。私はエラーをトレースすることができます。実際に私のcsvファイルには、DBのデバイステーブルには存在しない1つの追加の列が含まれています。 csvファイルでその列を削除すると、私のために働きます。 – Pawan

+0

次回はヒントを使って回答を更新しました。 –

答えて

0

ヘッダーに列名と一致しないものがあります。

このようなデータをインポートする場合、各csv列をModel属性にマッピングしても機能することを保証しない場合は、一致するヘッダーを持たない列を無視できます。

task :devices => [:environment] do 
     CSV.foreach('devices.csv', :headers => true, :encoding => 'ISO-8859-1:UTF-8') do |row| 
     params = row.to_hash.with_indifferent_access.select{ |x| Device.attribute_names.index(x)} 
     Device.create(params) 
    end 
    end 
関連する問題