ruby-on-rails - 在下载大型 CSV 文件作为后台进程时排队请求(延迟作业)

标签 ruby-on-rails csv delayed-job

这在我的 Controller 中工作正常。

def export_list_sites_as_csv
    require "csv"
    csv_string = CSV.generate do |csv|
      csv << ["id","name", 'etc']
      @search.relation.not_archived.each do |site|
        csv << [site.id, site.name, site.etc]
      end
    end
    send_data csv_string,
              :type => 'text/csv',
              :filename => '_sites.csv',
              :disposition => 'attachment'

  end
@search变量取决于用户过滤器,在范围内将放置 RAM 上的大量负载 ,用户体验不好。因为其他请求将被搁置,直到当前请求得到服务。这也使我的系统挂起。因此,希望在后台进程中运行,并在准备好下载后让用户知道。

当我尝试转向模型时。

I get an error undefined method `send_data' for #<\Class:0x9f8bed0>



我正在转向模型,因为我必须调用延迟工作。

第一次处理 CSV 和延迟作业。

编辑:ActionController::Streaming仅在 Controller 中可用,所以其他方式?更频繁与否,这不会去任何地方。

D面回答说,我将不得不寻找其他方式。

编辑 2:关注 http://railscasts.com/episodes/171-delayed-job我能够做到
class ExportCsv < Struct(:site_ids, :user_id)

def perform
    require "csv"
    sites = Site.where(id: site_ids)
    CSV.open("tmp/#{user_id}.csv", "w+") do |csv|
      csv <<  ["id","name", 'etc']
      sites.each do |site|
        csv << ....
      end
    end
  end


  def after(job)
    send_file(
      ....
      )
  end

end

使用方法 ActionController::Streaming在自定义类中 ExportCsv , 或 Model
编辑:

了解同步以及我如何处理这种情况,

答案 :http://imnithin.github.io/csv_download_with_delayed_job.html

最佳答案

您尝试做的事情违背了 DelayedJob 的目的。

当用户发出请求时,服务器应该做出响应以完成它。问题是,有些请求需要花费相当多的时间才能完成,用户必须等待它完成。一个经典案例 - 大量电子邮件交付,但正如您所提到的,还有其他案例,例如数据套件生成。任何。完成所需的时间比您可以让用户等待的时间更长。

现在来了 DelayedJob。它在没有查询上下文的情况下执行某个 Action 来响应。它不需要着急。但你不能只是一巴掌send_data为它:不会有任何查询要求它回复 .相反,它应该将完成的工作的结果写入一些持久存储。

你有很多方法可以解决这个问题。

  • 当数据集准备好时,您可以通过电子邮件通知您的用户。您甚至可以将其附加到电子邮件中,但我不建议这样做:您不能依赖电子邮件提供商准备好接受大量数据。制作一个下载数据集的链接并发送它。
  • DelayedJob 需要渲染数据集,将其保存到文件中,获取链接并通过电子邮件将其发送给用户。
  • 为您的应用创建一个听起来像“已完成的请求”的部分(模型、 Controller 和 View 的公司),这可能是用户个人资料的一部分。 “启动”请求应指示用户稍后返回并查看该列表以获取结果。
  • 请求完成后,DelayedJob 必须在该列表中创建一个条目。数据集的存储方式无关紧要,但您可以将其与上述方法结合,将其保存到文件中并显示指向它的链接。
  • 关于ruby-on-rails - 在下载大型 CSV 文件作为后台进程时排队请求(延迟作业),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27076999/

    相关文章:

    java - opencsv CSV 阅读器 - 从特定行开始读取。

    ruby-on-rails - 在 X 分钟内开始工作

    ruby-on-rails - 未定义的方法 `wikis_path'

    ruby-on-rails - 如何正确安装 dc.js 以便与 Rails 5 一起使用?

    python - 如何更新用户输入给出的 csv 文件的字段名?

    ruby-on-rails - Rails 如何为heroku 上的rake 任务创建后台任务?

    ruby-on-rails - Rails : Absolutely stumped with delayed_job. 没有在任何地方接收参数

    ruby-on-rails - 新建和编辑表单上的 rails activeadmin 下拉菜单

    ruby-on-rails - Rails 4+ 最佳实践 : Delete parent while keeping children

    java - 读取 CSV 文件返回 java.io.FileNotFoundException :