值为字符串时表属性的总和

问题描述 投票:2回答:3

我以前从未见过这个。我正在使用表属性,其值是字符串,而不是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-on-rails ruby postgresql ruby-on-rails-5
3个回答
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)")
  1. coalesce将用'0'替换空值
  2. sum所有的价值都被铸造到了DECIMAL

1
投票

在纯Ruby中,您可以使用方法inject

Model.all.inject(0) { |sum, object| sum += object.amount.to_i }

0
投票

我没有评论权限,但这应该适用于ruby:

Model.all.map(&:to_f).reduce(&:+)
© www.soinside.com 2019 - 2024. All rights reserved.