5

Ruby on Rails 3 を使用して、CSV ファイルから MySQL db にデータをインポートする作業を行っています。顧客モデルは既に作成されています。また、以下のスクリプトは puts row[2] と puts row[3] を正しく生成します。customers.warranty_part_no および Warranty_part_desc のデータベース フィールドの割り当てを追加すると、以下のエラーが発生します。

csv = CSV.read(file, col_sep: ",", headers: false)

c = Customer.new  
csv.each do |row|
        c.warranty_part_no = row[2],
        c.warranty_part_desc = row[3]
end

これが私が得るエラーです。

uninitialized constant Customer (NameError)

いくつかのテストの後、この問題は、このスクリプトをコマンドラインから実行しているため、より大きなレールアプリで customer.rb モデルが実行されていないため、 Customer クラスが作成されないことが原因だと思います。このスクリプトをコマンド ラインから実行して、ActiveRecord または activerecord-import を利用するにはどうすればよいですか? それが不可能な場合、ルートを作成するか、アプリのビューから呼び出すにはどうすればよいですか?

私は Ruby 1.9.2 と Rails 3.2.2 を使用しています。アドバイスをよろしくお願いします。

4

5 に答える 5

3

これについては、次の 2 つの方法があります。

 #myscripy.rb
 # add following in your script
 require 'rubygems'
 require 'active_record'
 require YOUR_DB_ADAPTER_GEM #'mysql2', 'pg'
 require PATH_TO_YOUR_MODEL

 csv = CSV.read(file, col_sep: ",", headers: false)

 c = Customer.new  
 csv.each do |row|
    c.warranty_part_no = row[2],
    c.warranty_part_desc = row[3]
 end
 c.save

それ以外の場合は、単純に rake タスクを記述できます (できれば同じ RailsApp で)

require 'csv'
 namespace :import do
 task :csv_file => :environment do
  csv = CSV.read(file, col_sep: ",", headers: false)

   c = Customer.new  
   csv.each do |row|
    c.warranty_part_no = row[2],
    c.warranty_part_desc = row[3]
   end
   c.save
  end
end

また、RailsApp を使用しているときにコマンドラインから呼び出すことができますrake import:csv_file

これについて疑問がある場合は、コメントしてください。

于 2012-07-19T01:53:59.723 に答える
2

お分かりのように、問題は Rails 環境がロードされていないことです。Customer モデル、active_record を含め、database.yml を使用して接続を確立することにより、スタンドアロン スクリプトでこれを行うことができます。

ただし、もっと簡単な方法があります。次のような rake タスクを作成します。

namespace :data do
  desc "Import data from CSV"
  task :import => :environment do
    #Your script here
  end
end

=> :environmentrake に Rails をロードするように指示するので、データベース接続とすべてのモデルがそのまま使用できるようになります。

で呼び出し、本番環境が必要な場合rake data:importは追加します。RAILS_ENV=production

于 2012-07-19T01:35:24.310 に答える
1

問題を修正する

問題は、スクリプトの起動時にRails環境がロードされていないことのようです。

Rails環境を正しく初期化するには、次のいずれかを行う必要があります。

サイド-CSVのインポートを簡単にするための注意

CSVファイルを配列の配列として扱うのはかなり不器用だといつも感じていました。

そこで、CSVファイルの各行をハッシュとして返す小さなメソッド「process_csv」を作成しました。これは、ActiveRecordまたはMongoidレコードの作成にはるかに適しています。

次のコードを使用して、の下./config/initializers/process_csv.rbに配置し、ブロックを渡してprocess_csv、CSVファイルの各行のコンシューマーレコードを作成できます。

:key_mappingオプションを使用して、CSV列の名前をActiveRecordモデルの正しい属性名に変更したり、結果ハッシュからCSVキーを削除したりできます。

ここに詳細なコメントを含むソースコード:

http://www.unixgods.org/~tilo/Ruby/process_csv_as_hashes.html

例えば:

require 'process_csv'

File.process_csv( file ) do | hash |
   Consumer.create( hash )
end

楽しい!

于 2012-07-20T03:57:58.020 に答える
1

I believe what you're looking for is the rails runner Rails Command Line Docs which will execute your ruby script in the environment of your rails application.

You could also use the rails console if you just want to access your rails objects in an interactive command shell. via rails console

于 2012-07-18T17:29:32.430 に答える
1

モデルにアクセスするために config/environment.rb を要求することもできます。

于 2012-07-19T15:04:52.647 に答える