関連するモデルの最大値・最小値の求め方

railsで関連するモデルの最大値・最小値の出し方です。

まったく知らなかったので、備忘録で書いておきます。

UserモデルがCommentモデルをもっているとします。

class User < ActiveRecord::Base
  has_many :comments
end

maximum

user = User.first
user.comments.maximum(:body)
   (0.3ms)  SELECT MAX(`comments`.`body`) FROM `comments` WHERE `comments`.`user_id` = 1
=> "testtesttest"
user.comments.maximum(:body).length
→12

minimum

user = User.first
user.comments.minimum(:body)
   (0.4ms)  SELECT MIN(`comments`.`body`) FROM `comments` WHERE `comments`.`user_id` = 1
=> "test"
user.comments.minimum(:body).length
   (0.3ms)  SELECT MIN(`comments`.`body`) FROM `comments` WHERE `comments`.`user_id` = 1
=> 4

これを知るまでは、user.comments.pluck(:body).lastとか、書いてました・・・orz

しかも、最後に最大値があるという前提で(苦笑)

一応こうやってもpluckで取れますね。

user.comments.pluck(:body).max_by(&:size)

ただ、ややこしくなるのでまったく意味がないですね。

ベンチマーク

ちなみに、速度的にどちらが早いのかを試しました。

irb(main):047:0> user.comments.pluck(:body).max_by(&:size).length
   (7.7ms)  SELECT `comments`.`body` FROM `comments` WHERE `comments`.`user_id` = 1
=> 24
irb(main):048:0> user.comments.maximum(:body).length
   (12.8ms)  SELECT MAX(`comments`.`body`) FROM `comments` WHERE `comments`.`user_id` = 1
=> 24

pluckの方が早い・・・

原因はなんなのか想像つかない。