2016-03-21 2 views
-1

У меня есть массив предположитьСумма массива в рельсах

[#<Data id: 1, date: "2016-01-06", value: "1">, 
#<Data id: 2, date: "2015-12-31", value: "3">, 
#<Data id: 3, date: "2016-01-06", value: "6">...] 

и так далее ..

Я хочу суммировать значения, имеющие ту же дату

т.е. здесь первая и третья запись имеют тот же день, так что результирующий массив даст

#<Data id: 1, date: "2016-01-06", value: "1">, 
#<Data id: 3, date: "2016-01-06", value: "7">, 
+1

Эй, попробуйте сгруппировать его как 'arr.group_by {| a | a.date.to_date} ' –

+0

Почему эти данные в массиве, это объекты ActiveRecord - можете ли вы собрать их как коллекцию ActiveRecord вместо массива? – Matt

+0

'array.group_by {| aa | aa.date} {.map | к, v | Date.new (1, k, v.inject (0) {| s, p | s + p.value})} 'вы пытаетесь это сделать? в рубиновом типе –

ответ

3

Эй вы можете использовать попробовать этот способ, если вы уже извлечь массив из базы данных

arr.group_by{|a| a.date.to_date}.map{|k,v| {k => v.map(&:value).sum()}} 

Если вы не выбрали массив/активную запись из базы данных, вы можете напрямую использовать запрос базы данных как Если база данных хранит только date, то вы можете использовать

Model.group("date").sum(:value) 

Если база данных хранит date with time здесь я должен использовать DATE_FORMAT функцию для пропуска времени часть даты

Model.group("DATE_FORMAT(date, '%Y%m%d')").sum(:value) 
+0

Да, этот должен работать - Data.all.group_by {| a | a.date.to_date} {.map | к, v | {k => v.map (&: значение) .sum()}} – dp7

+0

Спасибо, что это помогло .. –

3

Вы можете использовать SQL groupping на модели:

Data.where(date:(42.days.ago..Date.today)).group(:date).sum(:value) 

Это возвращает хэш {date => sum}

На массиве:

Hash[your_array.group_by(&:date).map{|k,v| [k, v.sum(&:value)]}] 
+0

Он дает NoMethodError: undefined метод 'group 'для массива –

+0

Не на массиве вы не можете. – Matt

0

сумма = Hash.new (0)

массив.элемент do | данные |

<p>sum[data[:date]] += data[:value]</p> 

конец

# => {: идентификатор => 1, "Ср, 4 мая 2011" => 300, "Вт, 3 мая 2011" => 450 ...}

# => Если вы хотите, чтобы это было в том же формате массива, вы начали с:

new_array = sum.collect {| ключ, значение | {: date => key,: value => value}}

# => [{: id => 1,: date => "ср, 04 май 2011",: значение => 300}, {. ...}]