4

非常に大量のデータを CSV 経由でダウンロードできる機能をユーザーに提供しています。これを行うために、私は Sidekiq を使用しており、タスクが開始されたら、そのタスクをバックグラウンド ジョブに入れています。バックグラウンド ジョブで行ったことは、適切なデータをすべて含む csv を生成し、保存してから、/tmpsave を呼び出すことです。私のモデルでは、ファイルの場所を paperclip 属性に渡し、それが消えて S3 に保存されます。

これらはすべて、ローカルで完全に正常に機能しています。私の問題は現在、Heroku にあり、使用しているノードに応じて短期間ファイルを保存する機能です。Heroku がこれらのファイルを処理する方法が原因で、バックグラウンド ジョブが保存された tmp ファイルを見つけることができません。これを行うためのより良い方法を探していると思います。すべてをメモリ内で実行できる方法があれば、それは素晴らしいことです。唯一の問題は、モデルを保存するときに、paperclip が実際のファイル オブジェクトを属性として想定していることです。私のバックグラウンドジョブは次のようになります。

class CsvWorker
  include Sidekiq::Worker

  def perform(report_id)
    puts "Starting the jobz!"
    report = Report.find(report_id)
    items = query_ranged_downloads(report.start_date, report.end_date)

    csv = compile_csv(items)

    update_report(report.id, csv)
  end

  def update_report(report_id, csv)
    report = Report.find(report_id)
    report.update_attributes(csv: csv, status: true)
    report.save!
  end

  def compile_csv(items)
    clean_items = items.compact
    path = File.new("#{Rails.root}/tmp/uploads/downloads_by_title_#{Process.pid}.csv", "w")
    csv_string = CSV.open(path, "w") do |csv|
      csv << ["Item Name", "Parent", "Download Count"]
      clean_items.each do |row|
        if !row.item.nil? && !row.item.parent.nil?
        csv << [
          row.item.name,
          row.item.parent.name,
          row.download_count
          ]
        end
      end
    end

    return path
  end
end

読みやすくするために query メソッドは省略しました。

4

1 に答える 1