Ruby on rails Rails:迭代一个类型的所有对象,而不一次加载所有对象

Ruby on rails Rails:迭代一个类型的所有对象,而不一次加载所有对象,ruby-on-rails,Ruby On Rails,但是所有的ID都不存在,有没有一个等价的?可以使用,它一次获取记录x,其中x是可配置的,默认为1000 Car.all_ids.each do |id| c = Car.find id # do stuff end 您可以执行以下操作: Person.where("age > 21").find_in_batches do |group| # group is an array of 1000 records group.each { |person| per

但是所有的ID都不存在,有没有一个等价的?

可以使用,它一次获取记录
x
,其中
x
是可配置的,默认为1000

Car.all_ids.each do |id|
  c = Car.find id
  # do stuff
end

您可以执行以下操作:

  Person.where("age > 21").find_in_batches do |group|
    # group is an array of 1000 records
    group.each { |person| person.party_all_night! }
  end
对于Rails 2.3,还不熟悉Rails 3

编辑

一种可能更高效的解决方案(减少查询):

对于Rails 2.3及以上版本(包括Rails 3),最简单的解决方案是分别查找:


Car.find(:all, :select => :id).map(&:id).each_slice(5) do |ids|
  cars_slice = Car.find(ids)
end
这会自动为您成批执行查询。默认批量大小为1000,但您可以自行设置。它还与命名作用域和ActiveRecord::Relations一起工作:

Car.find_each do |car|
  # do stuff
end

请参见Rails 4+中的,我发现弹拨非常有用

Car.hotrods.where(:color => 'red').find_each(:batch_size => 10) { do |car| ... }
Car.pluck(:id)
返回一个条目数组。通过更改参数,可以提取模型的任何其他列。此外,还可以拾取列的组合。例如:

Car.pluck(:id).each do |id|
  c = Car.find id
  # do stuff
end

不错(而且升级了),但不完全是我要找的(在批中发现批是不推荐的)。@SteveRawlinson:它没有被推荐,只是被移动到了批模块(我链接到你的是更新的、非推荐的版本)。旧版本住在其他地方,而那个版本已被弃用。不过,我想我知道你想要什么,而且我不相信有一种方法可以不使用原始SQL和游标来实现。我希望还有一项任务需要应用
。停止聚会会做他想做的事情,但效率很低,因为它执行
n
查询。实际上,这很好。大量的查询是没有问题的,我只关心内存。如果你有超过,比如说,1000万条记录,这将不会很好地工作。对于大型数据集,也许为了节省内存,考虑使用分页宝石(如果不知道谷歌中查找分页宝石),或考虑使用精彩。不敢相信我不知道。仅供参考,
pull
也存在于Rails 3中
Car.hotrods.where(:color => 'red').find_each(:batch_size => 10) { do |car| ... }
Car.pluck(:id).each do |id|
  c = Car.find id
  # do stuff
end
Car.pluck(:id, :make, :model).each do |id, make, model|
  c = Car.find id
  # access make and model as well
end