Rails 4 - 使用Delayed_Job导入CSV文件

4
我正在使用Rails 4构建一个市场应用程序,卖家可以在其中列出要销售的商品。我有一个CSV导入功能,因此卖家可以批量加载产品。导入代码在小文件上运行良好,但在大文件上遇到了超时问题。因此,我想使用delayed_job在后台处理这些文件。
我设置了delayed_job直到作业排队(我在delayed_job表中看到了该作业)。但是当我运行作业时,我收到一个错误,说找不到要导入的文件。它正在寻找不存在的临时文件夹中的文件。
如何将文件保存(或不保存)在延迟作业可以访问的位置?我如何告诉delayed_job文件的位置在哪里?
我的listings controller:
  def import
      Listing.import(params[:file], params[:user_id])
      redirect_to seller_url, notice: "Products are being imported."
  end

我的列表模型:

class Listing < ActiveRecord::Base

require 'csv'
require 'open-uri'

  class << self

    def importcsv(file_path)
        CSV.foreach(file_path, headers: true, skip_blanks: true) do |row|
          #some model processing
        end 
    end 
    handle_asynchronously :importcsv
  end

  # My importer as a class method
  def self.import(file, user_id)
    Listing.importcsv file.path
  end

end

以下是表单视图:

这里是表单视图:

<%= form_tag import_listings_path, multipart: true do %>
        <%= file_field_tag :file %>
        <%= hidden_field_tag :user_id, current_user.id %>
        <%= submit_tag "Import CSV" %>
<% end %>
1个回答

2

可能该文件是一个表单上传文件。我认为这些文件只在Web请求运行时存在。我的建议是使用FileUtils.copy将文件复制到一些在作业运行时存在的位置。因此,你可能不想异步处理importcsv,而是先复制文件,然后使用新的文件路径调用模型的私有方法(将由异步处理)。


你刚才在回答的时候,我已经添加了表单视图。你是对的。你能告诉我怎么做吗? - Moosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接