たぶん基本的なことなんだろうけど、自分は知りませんでしたシリーズ。
前提
タイトルのまんまなんですけど、Rails 4 で、Product
というモデルがありまして、その price
という属性の合計値を出したいなーという前提で。
Before
最初はまあ、下記のようなコードを書きますよね。ね、書きますよね。
sum = 0 products.each do |product| sum += product.price end
After - Enumerable.inject
で inject
使おうよ、という指摘を受けて、Enumerable#inject
の存在を知る。
- module Enumerable
- http://docs.ruby-lang.org/ja/2.1.0/class/Enumerable.html#I_INJECT
products.inject(0) { |sum, product| sum + product.price }
After x 2 - ActiveRecord::Calculations#sum
で、最近、となりのチームのソースを眺めていたら、ActiveRecord::Calculations#sum
というのを使ってました。
- ActiveRecord::Calculations
- http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum
products.sum(:price)
べんり〜
おまけ
ちなみに Enumerable#inject
は合計値を出すだけじゃなくて、他の場面にも応用できるし、Enumerable#sum
というのもあったりするのですが、ちょっと本筋から逸れるの割愛します。興味がある方は下記を参照してください。
- sum (Enumerable) - APIdock
- http://apidock.com/rails/Enumerable/sum
ではでは。