50k を超えるレコードを返すクエリの結果があります。そうです :
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..ビュー内の複数の選択に対するフィルターを作成します。かなり時間がかかります。パフォーマンスを向上させるために、すべての固有要素を 1 つのループで収集する方法はありますか? ありがとう
50k を超えるレコードを返すクエリの結果があります。そうです :
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..ビュー内の複数の選択に対するフィルターを作成します。かなり時間がかかります。パフォーマンスを向上させるために、すべての固有要素を 1 つのループで収集する方法はありますか? ありがとう
一意の列値を選択するための純粋な Ruby/Rails アプローチ (ハードコーディングされた SQL なし) は次のようになります。
uniq_fields1 = Model.uniq.pluck(:field_1)
# issues: SELECT DISTINCT field_1 FROM "models"
何かのようなもの
unique_field_1_values = Set.new
unique_field_2_values = Set.new
@array.each do |x|
unique_field_1_values << x
unique_field_2_values << x
end
配列を1回だけ反復し、フィールドの一意の値を持つ2つのセットを提供します。ただし、それがより速いかどうかはわかりません。
@tokland のコメントに沿って:
[:field1, :field2].map { |f| YourTable.select(f).uniq }
@Frederickが指摘しているように、これは実際にはdbへの2回のヒットですが、(おそらく)より高速になり、それらのフィールドにインデックスがある場合はほぼ確実に高速になります。