2010-11-21 101 views
2

我有一個ActiveRecord陣列紅寶石進樣方法問題

[#<Lead id: 134, address: "24 elm33",created_at: "2010-11-15 12:08:25", updated_at: "2010-11-16 12:53:36", usd_conv: 2741>, 
#<Lead id: 136, address: "guigiu", created_at: "2010-11-17 16:57:45", updated_at: "2010-11-17 16:57:45", usd_conv: 1000>] 

和我想改變這個使用注入到[[created_at,usd_conv(總該時間圖)]]

不限嚮導那裏知道如何做到這一點?

+0

更具體。你想得到總和,部分和的序列? – samuil 2010-11-21 12:13:07

+0

對不起,澄清,我正在尋找部分款項的序列。所以從上面的例子我會[2010-11-15 12:08:25,2741],[2010-11-17 16:57:45,3741]]。再次感謝球員 – stuartchaney 2010-11-21 16:35:22

+0

好的,我修復了我的答案 – 2010-11-21 16:58:02

回答

3

假設你需要「每個獨立created_at時間,計算所有usd_conv的總和達到這個時間」,這是通過一個接一個噴射值到數據結構來完成。下面是一個例子說,「內噴射」記載爲二值數組:

  • 中的第一項累加得到的記錄
  • 第二累積總和爲當前時刻

    array.inject([0,[]]) do |so_far,elem| 
        so_far[0] += elem.usd_conv 
        so_far[1] << [elem.created_at, so_far[0]] 
        so_far # Necessary because block should return the next so_far 
    end 
    
+0

也許我錯了,但我認爲created_at具有如此密集的分辨率,你會得到散列與元素數相等的原始記錄數... – samuil 2010-11-21 16:19:45

+0

歡呼聲。就是這樣,除了一開始就出現的總數。再次感謝。 – stuartchaney 2010-11-21 17:33:29

0
array.collect!{|e| [e.created_at, e.usd_conv]} 
+0

感謝您的回答Eimantas :),但我害怕我在尋找usd_conv的總數。我認爲注射是正確的路,但我不知道它.. – stuartchaney 2010-11-21 11:34:28

0

它不是injectreduce)方法的典型應用。想法是在你將數組簡化爲單個值時使用它。在這裏使用inject而不是其他迭代器,可以不顯式定義局部變量(如果有功能方法,這很好)。你真正需要的是mapinject組合 - 用蓄電池傳遞的值的數組在我看來使壞;)

由於沒有專門的方法做這樣的事情,我會堅持map(或map!) :

accumulator = 0 
ary.map! {|el| [el.created_at, accumulator += el.usd_conv]} 

下行方向正在累積更高水平的範圍累加器。

使用map的版本在進行基準測試時似乎快2-3倍(map vs map!版本)。