2015-05-05 107 views
0

我有一個ActiveRecord結果,並希望遍歷所有元素以返回一個總和。我有:使用注入只返回第一個值,並希望總數

readings=Reading.where("user_id=? and time between ? and ?", user_id, start_of_day, end_of_day) 
puts "ids: " + readings.map(&:id).to_s 
sum=0 
sum = readings.inject({}) do |total, element| 
    total = element.value 
    total 
end 
puts "here is the sum: #{sum}" 

但總和只是第一個值。我知道這是一個愚蠢的語法問題,但我做錯了什麼?

THX

+0

sum是一個數組還是散列? – pangpang

+0

應該只是一個int - 拍攝,所以只是試圖返回一個element.value的 – timpone

回答

2

請試試:

sum = readings.inject(0) do |total, element| # 0 is the initial value of `total` 
    total += element.value 
end 

如果你不明確指定total的初始值,則集合的第一個元素被用作total初始值。請注意, 如果readings是空陣列,sum將是nil

sum = readings.inject { |total, element| total += element.value } 
+0

的總數,你會說你應該總是把它設置爲0,如果是空的情況下,所以不是零? – timpone

+1

是的,如果你不想要的總和爲零,你應該設置初始值 – pangpang

1

我想你應該查找#inject方法的文檔。 (順便說一句,以上代碼的簡化版本是readings.pluck(:value).inject(:+))。注入只需遍歷將每個項目傳遞到塊的集合以及塊中最後返回的值。所以它也可以讓你做這樣的事情,如(1..10).inject(:eat) { |action, t| t.times { __send__(action) } if __send__("needs_to_#{action}?"); what_do_i_do_after_i(action) }(愚蠢的例子,但你看它比suming整數更有趣)

+0

thx的答案 - 老實說,注入有點吸收文檔 – timpone

+0

哈哈。是的,你可能是對的。 – jphager2

相關問題