関連するモデルの最大値・最小値の求め方
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の方が早い・・・
原因はなんなのか想像つかない。