繁体   English   中英

如何在rails中读取(导入)文件到db使用delay_job

[英]how to read (import) file to db use delay_job in rails

我有一个类导入import_jobs.rb

require 'roo'
class ImportJob < Struct.new(:path, :name)
  def perform
    import(path, name)
  end
  #
  def import(path, name)
    spreadsheet = open_spreadsheet(path, name)
    header = spreadsheet.row(1).map!(&:downcase)

    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose].to_hash     
      potential_user = PotentialUser.find_by_id(row[:id]) || PotentialUser.new
      potential_user.attributes = row
      potential_user.save!
    end
  end
  #
  def open_spreadsheet(path,extname)
    case extname
    when ".csv" then Roo::CSV.new(path)
    when ".xls" then Roo::Excel.new(path)
    when ".xlsx" then Roo::Excelx.new(path,file_warning: :ignore)
    else raise "Unknown file type: extname"
    end
  end
end

在我看来

<%= form_tag import_potential_users_path, multipart: true do %>
  <%= file_field_tag :file %>
  <%= submit_tag "Import" %>
<% end %>

在控制器中

def import
  if params[:file].present?
    Delayed::Job.enqueue ImportJob.new(params[:file].path, File.extname(params[:file].original_filename))
  redirect_to potential_users_path, notice: "Protential Users imported."
  else
    redirect_to potential_users_path
  end
end

在运行作业时,显示错误不退出文件。 当我运行它时,不要使用delay_job,代码正在工作

[Worker(host:ubuntu pid:14362)] Job ImportJob (id=860) RUNNING
[Worker(host:ubuntu pid:14362)] Job ImportJob (id=860) COMPLETED after 2.0222
[Worker(host:ubuntu pid:14362)] Job ImportJob (id=858) RUNNING
[Worker(host:ubuntu pid:14362)] Job ImportJob (id=858) FAILED (3 prior attempts) with IOError: file /tmp/RackMultipart20151211-14238-13b7xb does not exist
[Worker(host:ubuntu pid:14362)] 2 jobs processed at 0.7092 j/s, 1 failed

看起来临时文件在工人开始处理作业之前被删除。 我建议你将文件复制到另一个位置,然后再试一次。 这里有一大堆代码可能会有所帮助:

if params[:file].present?
  original_filename = params[:file].original_filename
  new_filename = "#{File.basename(original_filename)}_new"
  new_filepath = File.join(Dir.tmpdir, new_filename)
  FileUtils.cp(params[:file].path, new_filepath)
  import_job = ImportJob.new(new_filepath, File.extname(original_filename))
  DelayedJob.enqueue(import_job)
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM