【问题标题】:Rails 4 - Delayed_Job for CSV importRails 4 - 用于 CSV 导入的 Delayed_Job
【发布时间】:2014-11-12 03:30:22
【问题描述】:

我正在 Rails 4 中构建一个市场应用程序,卖家可以在其中列出要出售的商品。我有一个 csv 导入功能,因此卖家可以批量加载产品。导入代码在小文件上运行良好,但我遇到了较大文件的超时问题。所以我想用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 %>

【问题讨论】:

    标签: ruby-on-rails delayed-job


    【解决方案1】:

    大概该文件是一个表单上传。我认为这些文件仅在 Web 请求运行时才会保留。我的建议是使用 FileUtils.copy 将文件复制到作业运行时将存在的某个位置。 因此,您可能不想处理异步导入csv,而是复制文件,然后使用新文件路径在模型上调用私有方法(将异步处理)。

    【讨论】:

    • 我刚刚在您写答案时添加了表单视图。你说的对。你能告诉我怎么做吗?
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2011-05-23
    • 2013-07-17
    • 2014-11-30
    相关资源
    最近更新 更多