8

特定のフィールドFoo.whoのすべての値を抽出する必要がある巨大なテーブルFooがあります。

配列には数百万の行がありますが、列には数千の異なる値しかありませんwho

もちろん、テーブルが小さい場合は、単に使用しますFoo.pluck(:who)

各セットを使用する場合Foo.find_in_batches do |a_batch|、Fooレコードのactiverecordコレクションではなく、Fooレコードの配列であるため、列.pluck()を抽出する唯一の方法は、配列を反復処理するようなものを使用することです。who.map(&:who)

who列を抽出するために各バッチの各要素を反復する必要のないバッチで Foo から列を取り出す方法はありますwhoか?

4

3 に答える 3

1

in_batchesは既に内部で実行pluck(:id)され ( loadparam がfalseデフォルトの場合)、 との関係が生成されwhere(id: ids_from_pluck)ます。DBで別のクエリを実行する必要を回避して、リレーションからIDのリストを直接取得することは可能ですか?

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 に答える