我正在尝试将数据库行导出为CSV,具体取决于用户选择的参数。这些导出可能需要一段时间,因此我使用delayed_job处理它们并将它们上传到S3。我的控制器看起来像这样:
def search
@books = visible_books.includes(:publisher)
@books = @books.where(contract_id: assigned_contract_ids) if assigned_subscriber.present?
@books = @books.unifilter(params, to_cents: ['total_cost'])
respond_to do |format|
format.json { export }
format.js { @books.paginate(params[:page], per: 50) }
end
end
def export
exportable_books = ExportableBooks.new(@books)
exportable_books.delay.upload
render json: { id: exportable_books.id }
end
不幸的是,@books
最多可容纳10,000行,当它们被序列化为YAML for delayed_job时,所有这些行都被加载到内存中,然后以YAML格式写入数据库。有没有办法避免这种情况?
答案 0 :(得分:1)
问题是delay
需要将exportable_books
序列化到数据库中,exportable_books
保存@books
的完整结果集。
除此之外,您应该使用ExportableBooks
和params
初始化assigned_contract_ids
,因为序列化时要小得多。然后在upload
方法中运行查询。