ruby-on-rails – Rails 4 – 用于CSV导入的Delayed_Job

我正在Rails 4中构建一个市场应用程序,卖家可以列出要销售的商品.我有一个csv导入功能,所以卖家可以批量加载产品.导入代码在小文件上工作正常但我遇到了较大文件的超时问题.所以我想使用delayed_job在后台处理这些文件.

我将delayed_job设置为作业排队的位置(我在delayed_job表中看到了作业).但是当我运行该作业时,我收到一条错误消息,指出未找到要导入的文件.它正在查找临时文件夹中的文件,该文件在作业运行时不存在.

如何在delayed_job可以访问的位置保存(或不保存)文件?以及如何告诉delayed_job文件所在的位置?

我的列表控制器:

  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 %>

最佳答案 据推测,该文件是表单上传.我认为这些文件仅在Web请求运行时保持不变.我的建议是使用FileUtils.copy将文件复制到作业运行时将存在的某个位置.

因此,您可能不希望handle_asynchronously importcsv,而是复制文件,然后使用新文件路径调用模型上的私有方法(将以异步方式处理).

点赞