我试图根据用户选择的参数将数据库行导出为CSV。这些导出可能需要一段时间,因此我正在使用delay_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进行delay_job时,所有这些行都将加载到内存中,然后以YAML格式写入数据库。有办法避免这种情况吗?
问题是delay
需要序列化exportable_books
到数据库中并exportable_books
保存的完整结果集@books
。
取而代之的是,您应该ExportableBooks
仅使用params
and进行初始化assigned_contract_ids
,因为序列化时它要小得多。然后在upload
方法中运行查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句