ruby-on-rails - 有没有办法在不加载的情况下序列化 ActiveRecord Relation 对象?

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

我正在尝试根据用户选择的参数将数据库行导出到 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<的完整结果集.

相反,您应该仅使用 paramsassigned_contract_ids 初始化 ExportableBooks,因为在序列化时它要小得多。然后在 upload 方法中运行查询。

关于ruby-on-rails - 有没有办法在不加载的情况下序列化 ActiveRecord Relation 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909494/

相关文章:

ruby-on-rails - 为什么我的产品上没有显示我的价格?

ruby-on-rails - 如何检查 cucumber 中的单选按钮?

ruby-on-rails - Ruby on Rails 测试 - ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: 格式错误的数组文字:

ruby - 如何获取正则表达式中出现的字符的索引?

ruby - 这是一种什么样的 Ruby 数据结构?

javascript - 谁能告诉我如何在centos中打开扩展名为.dat的文件?

javascript - 将 javascript 变量传递给 javascript HAML 中的 ruby​​ 函数调用

ruby-on-rails - Rails where LIKE 和 array

ruby-on-rails-3 - 如何清除模型的 :has_many associations without writing to the database in ActiveRecord?

ruby-on-rails - Rails rake 数据库 :seed not creating objects that belong_to another object?