我正在尝试根据用户选择的参数将数据库行导出到 CSV。这些导出可能需要一段时间,所以我使用 delayed_job 来处理它们并将它们上传到 S3。我的 Controller 看起来像这样:
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 行,当它们为 delayed_job 序列化为 YAML 时,所有这些行都会加载到内存中,然后以 YAML 格式写入数据库。有没有办法避免这种情况?
最佳答案
问题是delay
需要将exportable_books
序列化到数据库中,而exportable_books
持有@books<的完整结果集
.
相反,您应该仅使用 params
和 assigned_contract_ids
初始化 ExportableBooks
,因为在序列化时它要小得多。然后在 upload
方法中运行查询。
关于ruby-on-rails - 有没有办法在不加载的情况下序列化 ActiveRecord Relation 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909494/