加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 下载大型CSV大小文件作为后台进程的排队请求(

发布时间:2020-12-16 21:04:12 所属栏目:百科 来源:网络整理
导读:这在我的控制器中工作正常. 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,:typ
这在我的控制器中工作正常.
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的范围内,UX不好.其他请求将被暂停,直到提供当前请求为止.这也使我的系统挂起.因此,希望在后台进程中运行,并在用户准备好下载后让用户知道.

当我尝试移动到模型.

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

我正在搬到模特,因为我不得不打电话给延迟工作.

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

编辑:ActionController :: Streaming仅在Controller中可用,所以其他方式?经常与否,这不会发生在任何地方.

正如D-Side的回答所说,我将不得不寻找其他方法.

编辑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",'etc']
      sites.each do |site|
        csv << ....
      end
    end
  end


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

end

如何在自定义类ExportCsv或Model中使用ActionController :: Streaming

编辑:

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

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

解决方法

你想要做的事情违背了DelayedJob的目的.

当用户发出请求时,服务器应该做出响应以便完成填充.问题是,有些请求需要花费很多时间才能完成,用户必须坚持下去并等待它完成.一个典型案例 – 大规模的电子邮件传递,但正如您所提到的,还有其他一些,如数据套件生成.随你.完成所需的时间比用户等待的时间要长.

现在来自DelayedJob.它执行某个操作而没有要响应的查询上下文.它不需要快点.但你不能只为它拍一下send_data:它不会有任何查询要响应它.相反,它应该将完成的工作的结果写入一些持久存储.

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

>数据集准备就绪后,您可以通过电子邮件通知用户.您甚至可以将其附加到电子邮件中,但我不建议您:您不能依赖电子邮件提供商准备接受大量数据.建立一个链接以下载数据集并发送它.

> DelayedJob需要渲染数据集,将其保存到文件中,获取链接并通过电子邮件将其发送给用户.

>创建一个听起来像“已完成的请求”的应用程序部分(模型,控制器和视图的公司)可能是用户配置文件的一部分. “启动”请求应该指示用户稍后返回并查看该列表以获得结果.

>在满足请求后,DelayedJob必须在该列表中输入一个条目.数据集的存储方式无关紧要,但您可以将其与上述方法结合使用,将其保存到文件中并显示指向它的链接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读