2010-11-21 3 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

+0

Извините, уточните, я ищу скругление частичных сумм. поэтому из приведенного выше примера я бы [[2010-11-15 12:08:25, 2741], [2010-11-17 16:57:45, 3741]]. Еще раз спасибо ребятам – stuartchaney

+0

хорошо, я исправил свой ответ –

ответ

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

+0

cheers pavel. то есть, кроме всего, что появляется в начале. еще раз спасибо. – stuartchaney

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

спасибо за ваш ответ Eimantas :), но я боюсь, что я ищу общее количество usd_conv. Я думаю, что инъекция - правильный путь, но я не знаю, что это хорошо .. – stuartchaney

0

It не является типичным применением метода inject (reduce). Идея заключается в том, чтобы использовать его, пока вы уменьшаете массив на одно значение. Использование inject над другими итераторами здесь позволяет явно не определять локальную переменную (что хорошо, если у вас есть функциональный подход). Что вам действительно нужно, это сочетание map и inject - используя массив значений, передаваемых в аккумуляторе, на мой взгляд подвох;)

Поскольку не существует никакого специального способа делать такие вещи, которые я бы прилипают к map (или map!) :

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

Даунсайд забивает верхний уровень с аккумулятором.

Версия с использованием map в сравнении с 2-мя раз быстрее (map vs map! версия).

Смежные вопросы