2016-10-02 64 views
0

我有類Call - 它表示單個電話呼叫具有一定的分鐘數/秒數,通話日期等。我想總結給定日期的呼叫長度。 問題是我的數據是字符串格式,我使用各種Time.parse選項和許多不同的東西來格式化它。 但我的主要問題是,如何總結它們?我需要像Ruby的inject/reduce,但足夠聰明,知道60秒是一分鐘。 另一個問題是我正在從.CSV文件中讀取數據,將每一行都變成散列,並使Call對象不在其中。 任何提示? :)紅寶石 - 如何添加phonecall的長度? CSV文件

+2

你是否考慮在數據庫中存儲秒數作爲整數?所以不是存儲''1:43''store'103'。這使得用這些值計算(總和或平均)變得更容易。 – spickermann

+2

是的,我將其推廣爲「如果可以對數值進行數學運算,總是將它們存儲爲數字,如果數學不可能,則將它們存儲爲字符串或其他適當類型」這使得通話持續時間成爲一個數字,房子街道號碼一個字符串。是的,它首先看起來像一個數字(甚至名字是「數字」),但a)你不能做數學和b)這個結構將打破第二個你必須存儲地址,如「貝克街221b 「 –

+2

@SergioTulentsev:我喜歡你的經驗法則。我想添加建議,以[SI單位](https://en.wikipedia.org/wiki/International_System_of_Units)將這些值標準化。 – spickermann

回答

1

我建議將呼叫的持續時間存儲爲整數中的秒數。因爲這可以讓你輕鬆地在數據庫中運行計算。

但是,如果你喜歡,讓你可能需要使用像這樣的字符串表示:

# assuming `calls` is an array of call instances and the 
# duration of the call is stores an attribute `duration` 
total = calls.sum do |call| 
    minutes, seconds = call.duration.split(':') 
    minutes * 60 + seconds 
end 

# format output 
"#{total/60}:#{total % 60}" 

請注意:sum方法的ActiveSupport的一部分。當你使用沒有Rails的純Ruby時,你需要用這個代替:

total = calls.inject(0) do |sum, call| 
    minutes, seconds = call.duration.split(':') 
    sum + minutes * 60 + seconds 
end 
+0

謝謝你的提示 - 我收到錯誤「未定義數組的方法總和」 – Jes

+0

非常感謝! – Jes

0

你可能可以map他們都通過Float通過Time.parse,然後inject映射的浮點數組表示012秒。

+0

但它知道將60秒轉換爲一分鐘嗎? – Jes

+0

因爲你會寫一段代碼將分鐘數乘以60? –