我正在使用后台作业来从csv文件中导入用户数据到我的数据库。首先,我在我的User模型中“硬编码”了这个过程,只是通过调用User模型中的一个方法,并传递一个通过表单file_field
传输的文件路径:
User.import_csv(params[:file].path)
在本地和生产环境(heroku)中都能很好地工作。
现在,当处理大型CSV文件时,我意识到需要一个后台任务来执行导入。我熟悉redis和sidekiq,因此这个任务很快就被建立了。
CsvImportJob.perform_async(URI.parse(params[:file].path))
在我的 worker 中:
def perform(file_path)
User.import_csv(file_path)
end
这在本地也可以完美运行,但是一旦在生产环境中使用,就会在我的日志中看到以下错误:
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987726+00:00 app worker.1 - - 3 TID-oqvt6v1d4 ERROR: Actor crashed!
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987728+00:00 app worker.1 - - Errno::ENOENT: No such file or directory @ rb_sysopen - /tmp/RackMultipart20150810-6-14u804c.csv
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987730+00:00 app worker.1 - - /app/vendor/ruby-2.2.2/lib/ruby/2.2.0/csv.rb:1256:in `initialize'
这是变量
file_path
。当我将其传递给Sidekiq作业时,Heroku无法找到该文件。如果没有使用Sidekiq,则可以正常工作。我不知道如何解决这个问题,因此需要帮助。