pluckがmapより速いからと言って、いつでも使って良いわけではないそうです
Rails3.2から導入されたpluckメソッドのパフォーマンスが素晴らしい件
こちらの記事にも代表されるように、
User.map(&:id)
と書くよりUser.pluck(:id)
と書いたほうが方がパフォーマンスは速いと言われている。(実際速い
ただ、APIをみるとpluck
はArrayを返すと書いてあり、要は、pluck
を使うと、それが読まれたときにSQLが発生するのだ。
したがって、このように書くと、
User.where(id: Comment.where(...).pluck(:user_id))
この一行の中でSQLが2回走ってしまうのだ。
なので、こんな時はJOINするなりmerge
を使うなりして、
User.joins(:comments).merge(Comment.where(...))
と書いたほうが、SQLの発行回数を抑えられて、パフォーマンスコストを抑えられる。
時間に追われていたためベンチマークをとっていないが、
SQLの発行というのはコストがかなり高いので、おそらく後者の方が速いはずだ。
pluck
は単体で使用する際は便利だが、where
文の中などで使用する際は注意が必要です。
- 作者: 高橋征義,松田明,諸橋恭介
- 出版社/メーカー: SBクリエイティブ株式会社
- 発売日: 2013/09/01
- メディア: Kindle版
- この商品を含むブログを見る
Crafting Rails 4 Applications: Expert Practices for Everyday Rails Development (The Facets of Ruby)
- 作者: José Valim
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2014/02/04
- メディア: Kindle版
- この商品を含むブログを見る