有没有办法序列化ActiveRecord Relation对象而不加载它?

时间:2014-07-23 11:39:05

标签: ruby-on-rails ruby activerecord delayed-job

我正在尝试将数据库行导出为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格式写入数据库。有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:1)

问题是delay需要将exportable_books序列化到数据库中,exportable_books保存@books的完整结果集。

除此之外,您应该使用ExportableBooksparams初始化assigned_contract_ids,因为序列化时要小得多。然后在upload方法中运行查询。