Ruby on rails 是否可以在Rails/ActiveRecord中运行find_by_sql查询,而不将所有结果加载到内存中?

Ruby on rails 是否可以在Rails/ActiveRecord中运行find_by_sql查询,而不将所有结果加载到内存中?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在构建一个Rails插件,从Rails应用程序中提取大量数据。它动态地构建跨多个表的查询,并将返回大量结果。下面是一个为从Spree(Rails购物车)中提取购买数据而构建的查询示例: 选择orders.user\u id as from\u id,variants.product\u id as to\u id from orders,line\u items,variants where orders.user\u id不为null,variants.product\u id不为null

我正在构建一个Rails插件,从Rails应用程序中提取大量数据。它动态地构建跨多个表的查询,并将返回大量结果。下面是一个为从Spree(Rails购物车)中提取购买数据而构建的查询示例:

选择orders.user\u id as from\u id,variants.product\u id as to\u id from orders,line\u items,variants where orders.user\u id不为null,variants.product\u id不为null,orders.id=line\u items.order\u id和line\u items.variant\u id=variants.id order by from\u id


问题是ActiveRecord会将所有结果加载到内存中。有没有一种方法可以避免这种情况,而不必写特定于DB的代码?(我知道find_each,但这不允许排序。)

这绝对是可能的,下面是一篇文章:


他们有可以逐字复制的代码,但关键是使用SQL的
count
方法。使用此代码,您可以调用
paginate_by_sql
,而不是
find_by_sql
,然后传入页面和每页参数。

也许您还想查看Rails ActiveRecord批次,以检索较小块中的记录:


Jaime的回答引导我走上了一条更高效的查询路径,它提供了一种逐页sql方法。只需稍加努力,就可以将其封装在一个分页的SQL中:

def paginated_sql_each(query, &block)
  page = 1
  begin
    results = paginate_by_sql(query, :page => page)
    results.each { |r| block.call(r) }
    page += 1
  end while !results.empty?
end

在批处理中查找就像在每个批中查找一样,它不支持排序(或自定义SQL)。