2010-11-21 71 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!版本)。