8

我有一个巨大的表 Foo,我需要从中提取某个字段 Foo.who 中的所有值。

该数组有数百万行,但列中只有几千个不同的值who

如果桌子更小,我当然会使用Foo.pluck(:who)

如果我使用Foo.find_in_batches do |a_batch|每个集合是 Foo 记录的数组,而不是 Foo 记录的 activerecord 集合,那么我不能使用.pluck()和 AFAIK 提取列的唯一方法who是通过类似.map(&:who)的方法遍历数组。

有没有一种方法可以who分批从 Foo 中提取列,而不需要遍历每个批次的每个元素来提取who列?

4

3 回答 3

5

在 Rails 5 中,您可以使用:

Foo.in_batches do |relation|
  values = relation.pluck(:id, :name, description)
  ...
end

更新:为防止内存泄漏,请使用:

Foo.uncached do
  Foo.in_batches do |relation|
    values = relation.pluck(:id, :name, description)
    ...
  end
end
于 2019-10-18T13:29:07.580 回答
1

in_batches将已经pluck(:id)在后台运行(如果loadparam 是false默认值)并产生与where(id: ids_from_pluck). 那么是否可以直接从关系中获取 id 列表,从而避免在 DB 中运行另一个查询:

Foo.in_batches do |relation|
  ids = relation.where_values_hash['id']
end

这应该适用于 Rails 5.x 和 6.x,但依赖于 in_batches 的实现细节,因此将来可能会改变。

于 2021-03-31T10:23:04.350 回答
1

尝试这个:

Foo.select(:id, :who).find_in_batches do |a_batch|
  ...
end
于 2016-06-16T09:02:02.143 回答