業務でmap
とpluck
の違いを意識することが増えたので、整理する
map | pluck | |
---|---|---|
公式doc | https://docs.ruby-lang.org/ja/latest/class/Array.html#I_COLLECT | https://railsdoc.com/page/model_pluck |
RubyのArrayクラスのメソッド | RailsのActiveRecordのメソッド | |
各要素に対してブロックを評価した結果を全て含む配列を返す | 指定したカラムのレコードの配列を返す | |
特定のカラムの配列を取得したいときの記法 | Array.map(&:カラム名) | モデル.pluck(:カラム名) |
ActiveRecordインスタンスの生成 | する(必要なカラム以外の全てのカラムをloadする) | しない(必要なカラムのみを取得する) |
使い分け | インスタンスからカラムの配列を取得したいとき | インスタンス以外から直接カラムの配列を取得したいとき |
詳細説明 | 取り出したいカラム以外の情報も取得するためメモリ使用量は増えてしまう。既にインスタンス化されたものにmapを使用することで余計なクエリ発行を防ぐことができる。 | メモリ使用量が少なく大量のデータを扱う場合にパフォーマンスが高い。ただメソッド実行時に毎回SQL分が発行されるので、N+1の原因になるケースがあるので注意 |
User.all.map(&:id)
# => User Load SELECT `users`.`id`, `users`.`name`, (省略) FROM `users`
User.all.pluck(:id)
# => User Pluck SELECT `users`.`id` FROM `users`
# インスタンスに対してmapを使用する例
users = User.all
# => User Load SELECT `users`.`id`, `users`.`name`, (省略) FROM `users`
users.map(&:id)
# => [1,2,3,4,...,100]
[参考]