dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

【Rails/ActiveRecord】特定のカラムの情報だけ欲しい場合は、pluckかselectを使う

例えば、「特定の条件を持つユーザ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]