如何在后台任务中生成CSV文件?

时间:2012-01-09 12:17:08

标签: ruby-on-rails ruby-on-rails-3 csv background-process

我们允许用户以CSV格式下载所有数据,但我们发现对于很多用户(拥有大量数据)我们确实需要在后台生成CSV文件然后提供它们一个链接,以便稍后下载。

我知道如何在视图中动态生成CSV文件,但我并不完全清楚在后台任务中生成它的最佳方法。

我目前正在使用csv_builder在视图中生成CSV文件...所以能够仍然使用它并且以某种方式将其直接输出到CSV文件中我很棒使用回形针上传到S3 ...但这可能太牵强了。

2 个答案:

答案 0 :(得分:5)

我遇到了类似的问题,但是使用了内置的rails CSV库而不是csv_builder(我对此一无所知)。

在我的模型中,我有一个生成csv并在s3上保存为paerclip附件的方法:

def csv_export
  @entries = self.entries    
  @filename = "naming my file"    
  CSV.open("#{Rails.root.to_s}/tmp/#{@filename}", "wb") do |csv| #creates a tempfile csv
    csv << ["Date & Time", "Name", "Email"] #creates the header
    @entries.each do |e|            
      csv << [e.created_at, e.name, e.email] #create new line for each item in collection
    end
end

self.update_attribute(:csv_report, File.open("#{Rails.root.to_s}/tmp/#{@filename}"))
  #saves tempfile as paperclip attachment
end

我在rake任务中调用此方法,该任务卸载到延迟的作业工作者。

所以在rake任务中:Object.delay.csv_export

答案 1 :(得分:0)

您可以创建一个数据库表,在后台创建文件后可以在其中保存文件。我可以向您展示Rails迁移。

  create_table "csv_table", force: :cascade do |t|
    t.binary "csv_file"
    t.string "file_name"
  end

创建此文件后,您可以在此处保存csv文件。您可以使用

将文件保存为二进制文件
csv_converted_file = Base64.encode64(csv)

csv是数据。

现在,如果要在后台下载csv。您可以使用此咖啡脚本下载此文件。您将发出ajax请求,以获取刚刚保存在csv表中的csv数据。

   $.ajax
    type: 'GET'
    dataType: "text"
    url: url
    success: (data) ->
      blob = new Blob([data], { type: "text/csv" })
      file_name_url = new URL(window.location.href)
      file_name = file_name_url.searchParams.get("file_name");
      url = window.URL.createObjectURL(blob)
      a = document.createElement('a')
      a.setAttribute('hidden', '')
      a.setAttribute('href', url)
      a.setAttribute('download', file_name)
      document.body.appendChild(a)
      a.click()
      document.body.removeChild(a)
  return

这样,您的csv将在所需页面加载时下载。