2016-09-25 34 views
0

我從來沒有遇到過這種情況。我正在處理一個表屬性whos值是一個字符串,而不是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

你需要做鑄造作爲SELECT CAST('1234'AS FLOAT)。 –

+0

你不應該使用浮動金額。 – Stefan

+0

我知道。我正在和別人分享數據。他們不會改變它。 – Sylar

回答

3

使用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. ​​3210將'0'
  2. sum所有值替換空值鑄造到DECIMAL
+0

IIRC,您必須指定精確度,例如'DECIMAL(10,2)' – Stefan

+0

@Stefan AFAIR指定精度是可選的 –

2

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

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

壞主意,如果有很多對象這種方法會導致內存過載。 –

0

我沒有評論權限,但這應該對Ruby的工作:

Model.all.map(&:to_f).reduce(&:+) 
+0

這是行不通的,因爲你必須總結數量屬性的值而不是對象本身。 'Model.all.map(&:amount).map(&:to_f).reduce(&:+)' –