Rails3.2から新たに追加された新機能としてpluckメソッドというのがあるんですが、
(pluckは引き抜くという意味のようです)

これが大変素晴らしいなと感動しました。そもそもこのメソッドは引数としてカラム名を渡すとそのカラムの値が配列で返ります。

User.pluck(:name)
# => [sasata299, name1, name2, name3, ...]

つまり、User.all.map(&:name)と同じような処理なのですが、素晴らしいのはそのパフォーマンスです。mapを使った場合(selectで絞込みをした場合としてない場合)とpluckを使った場合でパフォーマンスを比較してみましょう。

それぞれの処理を1000回ずつ行って計測してみます。対象としたデータは10,000件程度で、それぞれのデータはカラムを20個ほど持っている状態です。

n = 1000
Benchmark.bm(15) do |x|
  x.report(select & map:) { n.times { Product.active.select(:name).map(&:name) } }
  x.report(map only:) { n.times { Product.active.map(&:name) } }
  x.report(pluck only:) { n.times { Product.active.pluck(:name) } }
end

結果はこうなりました。selectで絞込みしない場合には8倍ほど高速です。selectで絞込みしたとしてもその4倍以上高速ですね\(^o^)/

                      user    system        total           real
select & map:  573.6900000  2.760000  576.4500000  (585.3751010)
map only:      1025.340000  6.620000  1031.960000  (1052.642979)
pluck only:    126.4800000  0.780000  127.2600000  (132.7190650)

素晴らしいッ!!いちいちActiveRecordオブジェクトを生成しないから早いッ!!

積極的に使っていくと良いのではないでしょうか。(U^ω^)
このエントリーをはてなブックマークに追加