例えば、「特定の条件を持つユーザIDだけ欲しい」といった場合に有効。この時、 pluck
を使うと戻り値は Array
で、 select
を使うと ActiveRecord::Relation
が返る。
この時、 map
を使うのは無駄なメモリを食ったり動作が遅くなったりするので、やってはいけない。
# このようなUserモデルがあるとする User.where('created_at >= ?', Time.zone.yesterday) # => #<ActiveRecord::Relation [<#User id: xxx, ...>, <#User id: xxx, ...>, ...]>
# 昨日と今日に登録したユーザのユーザIDを取る場合を考える。 # select だと、ActiveRecord::Relation が返る User.where('created_at >= ?', Time.zone.yesterday).select(:id) # => #<ActiveRecord::Relation [#<User id: xxx>, #<User id: xxx>, ...]> # pluck だと、Arrayが返る User.where('created_at >= ?', Time.zone.yesterday).pluck(:id) # => [xxx, xxx, ...] # これはやってはダメ、無駄にメモリを使ってしまう User.where('created_at >= ?', Time.zone.yesterday).map { |user| userid } # => [1, 2, ..., 10]