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