值为字符串时 table 个属性的总和
Sum of table attributes when value is string
我以前从未遇到过这种情况。我正在使用一个 table 属性,它的值是一个字符串,而不是 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
?
在纯 Ruby 中,您可以使用方法 inject
。
Model.all.inject(0) { |sum, object| sum += object.amount.to_i }
我没有评论权限,但这应该适用于 ruby:
Model.all.map(&:to_f).reduce(&:+)
使用 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
。
我以前从未遇到过这种情况。我正在使用一个 table 属性,它的值是一个字符串,而不是 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
?
在纯 Ruby 中,您可以使用方法 inject
。
Model.all.inject(0) { |sum, object| sum += object.amount.to_i }
我没有评论权限,但这应该适用于 ruby:
Model.all.map(&:to_f).reduce(&:+)
使用 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
。