我之前从未见过这个。我正在处理一个表属性,其值是一个字符串,而不是float / int。
Model.first.amount => "58.00"
我需要总结所有金额。在amount
为浮点数的情况下,我常常使用的是:
Model.all.sum(&:amount) => # total value
用一个疯狂的猜测:
Model.all.sum(&:amount.to_i) # undefined method `to_i' for :amount:Symbol
有没有一个简洁的方法来总结金额?或者将数据库转换为float
?
答案 0 :(得分:6)
使用Ruby处理数据库是超级内存无效的!
第一枪:
Model
.pluck(:amount) # will fire sql
.sum(&:to_f) # convert to float, operating on resulting Array, not AR and sum
但是处理数据库数据最有效的方法当然是SQL:
Model.sum("CAST(COALESCE(amount, '0') AS DECIMAL)")
coalesce
会将空值替换为'0'
sum
所有值都投放到DECIMAL
。答案 1 :(得分:1)
在纯Ruby中,您可以使用方法inject
。
Model.all.inject(0) { |sum, object| sum += object.amount.to_i }
答案 2 :(得分:0)
我没有评论权限,但这应该适用于ruby:
Model.all.map(&:to_f).reduce(&:+)