控制器对延迟作业的操作

2024-04-28

我正在上传一个制表符分隔的文档并在控制器中进行处理。一切正常,但处理大文件可能需要一些时间。我想将其移至delay_job,我在应用程序的其他地方工作,但由于这是在控制器中,因此无法以相同的方式调用。

该表单调用 process_file 操作,该操作又调用 salesupload 操作。我应该如何将其变成后台作业?

class SalesController < ApplicationController

  def salesupload(file)
    uploaded_io = file.read
    numrows = "uploaded_io.size"
    FasterCSV.parse(uploaded_io, {:headers => true, :col_sep =>"\t"}).each do |row_data|
        full, upc, _discard, isrc = row_data[26].match(/^([^_]+)(_(.+))?/).to_a
          new_record = AppleSale.new(
              'provider' =>  row_data[0],
              'provider_country' => row_data[1],
              'vendor_identifier' => row_data[2]
          )
      new_record.save
    end
  end

    def process_file
        file = params[:apple_sale][:tsv_file]
        salesupload(file)
    end

end

我发现当我必须这样做时,控制器中定义的方法必须是类方法。我不记得为什么会这样,我认为这与有一个更明确的接收器有关。所以我要做的就是使 salesupload 方法成为一个类方法,然后调用.delay on it.

def self.salesupload(files)
  # code
end

def process_file
  file = params[:apple_sale][:tsv_file]
  SalesController.delay.salesupload(file)
  head :no_content
end

你应该可以走了!我也做了我原来的方法(process_file在本例中)通过 AJAX 调用,然后我附加了head :no_content这样它就可以返回一些东西而不需要重定向或任何东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制器对延迟作业的操作 的相关文章

随机推荐