gpt4 book ai didi

ruby-on-rails - 在 Ruby on Rails 中将关联/关系集合对象分解为更小的关联/关系集合

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:14 24 4
gpt4 key购买 nike

JRuby、Rails 3

我有一段代码查询许多表,通过关联关联,返回组合结果集作为 ActiveRecord::Relation。我的问题是,当此函数检索到一个非常大的结果集并尝试对其执行某些操作时(在我的例子中,创建一个 .xls 文件),JVM 错误,报告 GC 内存堆问题。

问题部分归因于在尝试处理 .xls 导出时所有这些记录都保存在内存中,以及 JRuby 有问题的垃圾收集器 - 但是,所有这些记录无论如何都不应该立即处理!所以我的解决方案是将这些记录分成更小的 block ,将它们写入文件并重复。

但是,在我的所有其他约束中,我需要使用的下一部分代码需要传递给它的关系对象。以前,这是整个结果集,但此时,我将其分解成更小的部分(为了论证,假设有 100 条记录)。

此时,您可能在想,是的 - 有什么问题吗?好吧,请看下面我的示例代码:

#result_set = relation object
result_set.scoped.each_slice(100) do |chunk|
generic_filter = App::Filter.new(chunk, [:EXCEL_EXPORT_COLUMNS]) #<-- errors here

#do some stuff
generic_filter.relation.each_with_index do |work_type, index|
xls_doc.row(index + 1).concat(generic_filter.values_for_row(work_type))
DATE_COLUMN_INDEX.each do |column_index|
xls_doc.row(index + 1).set_format column_index,
::Spreadsheet::Format.new(number_format: 'DD-MM-YYYY')
end
end
[...] #some other stuff
end

如您所见,我将 result_set 拆分为 100 条记录的较小块,并将其传递给需要关系对象的 App::Filter 类。但是,使用 each_slicein_groups 将 result_set 分割成更小的 block 会导致 block 内出现错误,因为这两种方法返回结果数组,而不是关系。

我是 Ruby on Rails 的新手,所以我的问题是:

  • 关系实际上是一个对象/集合/或类似预定义的查询,很像准备好的语句?
  • 是否可以使用类似于以下的方法返回较小的关系对象each_slice 或 in_groups 并按预期处理它们?

任何指示/建议都会受到欢迎 - 谢谢!

最佳答案

关系是一种构建 SQL 查询(INSERT、SELECT、DELETE 等)的助手。在您的示例中,您使用 each_slice 触发 SELECT 查询并获得结果数组。

我还没有检查,我不确定 each_slice 是否在做您想要的...您应该检查 find_each

你可能应该这样做:

# do what you need with the relation but do NOT trigger the query
generic_filter = App::Filter.new(result_set.scoped, [:EXCEL_EXPORT_COLUMNS]) #<-- errors here

# trigger the query by slice
generic_filter.relation.find_each do |chunk|
chunk.each_with_index do |work_type, index|
xls_doc.row(index + 1).concat(generic_filter.values_for_row(work_type))
DATE_COLUMN_INDEX.each do |column_index|
xls_doc.row(index + 1).set_format column_index,
::Spreadsheet::Format.new(number_format: 'DD-MM-YYYY')
end
end
end

关于ruby-on-rails - 在 Ruby on Rails 中将关联/关系集合对象分解为更小的关联/关系集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com