CSV를 통해 매우 많은 양의 데이터를 다운로드 할 수있는 기능을 사용자에게 제공하고 있습니다. 이렇게하기 위해 Sidekiq을 사용하고 일단 작업을 시작하면 백그라운드 작업을 시작합니다. 백그라운드 작업에서 수행 한 작업은 적절한 데이터가 모두 포함 된 CSV를 생성하고 /tmp
에 저장 한 다음 저장을 호출합니다! 내 모델에서 파일 위치를 paperclip 속성으로 전달하고 그 속성은 S3에서 저장됩니다.CSV를 생성하여 백그라운드 작업 완료시 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
내가 readabilities 술에 대한 쿼리 방법을 생략했습니다.
그레이트 잡기! 실제로 StringIO 접근 방식으로 끝났습니다. – John
TypeError :이 접근 방식으로 CSV를 String으로 암시 적으로 변환하지 않습니다. 레일즈 3.2 – xamenrax