3

csvファイルからrailsデータベースにデータを読み込もうとしています。これは私のレーキタスクです:

namespace :db do
require 'csv'
  desc "load user data from csv"
  task :load_csv_data  => :environment do
    CSV.foreach("transfers.csv") do |row|
      Transfer.create(
      :transfer_id => row[0],
      :net => row[1]
      )
    end
  end
end

そしてそれはlib\tasks\inport_csv_data.rakeとして保存されます。transfer.csvファイルは同じフォルダーに保存されます。

this is what i get when trying to run the task from the shell:
$ rake db:load_csv_data --trace
** Invoke db:load_csv_data (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_csv_data
rake aborted!
No such file or directory - transfers.csv
c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/csv.rb:1342:in `initialize'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/csv.rb:1342:in `open'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/csv.rb:1342:in `open'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
c:/Users/uklar/openfinance/lib/tasks/import_csv_data.rake:7:in `block (2 levels) in <top (required)>'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:227:in `call'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:227:in `block in execute'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:222:in `each'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:222:in `execute'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:166:in `block in invoke_with_call_chain'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:159:in `invoke_with_call_chain'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/task.rb:152:in `invoke'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:141:in `invoke_task'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:99:in `block (2 levels) in top_level'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:99:in `each'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:99:in `block in top_level'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:108:in `run_with_threads'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:93:in `top_level'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:71:in `block in run'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:158:in `standard_exception_handling'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/lib/rake/application.rb:68:in `run'
c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rake-10.0.2/bin/rake:37:in `<top (required)>'
c:/RailsInstaller/Ruby1.9.3/bin/rake:19:in `load'
c:/RailsInstaller/Ruby1.9.3/bin/rake:19:in `<main>'
Tasks: TOP => db:load_csv_data

私がここで何を間違っているのか考えていますか?それはすべて簡単にきれいに見えます...ありがとう!

4

2 に答える 2

4

rake タスクをコマンド ラインから開始すると仮定すると、Ruby は rake タスクの開始時にコマンド ラインが存在する現在の作業ディレクトリ内のファイルを探します。これが見つからない理由です。

于 2013-02-03T20:32:20.623 に答える
2

ファイルを明示的に指定する必要があります。これは、ファイルが実際にrake タスクと同じフォルダーにあるfile/path/to/your/rails/app/lib/tasks/transfers.csv仮定します。.csvlib/tasks

# ...

file = File.expand_path('../transfers.csv', __FILE__)
CSV.foreach(file) do |row|
  # ...
于 2013-02-03T20:41:57.787 に答える