2010-11-11 3 views
3

У меня есть модель ItemsSold, которая имеет общее количество журналов, книг, видеороликов, greeting_cards, ручек, проданных за один день. Как я могу изящно возвращать массив с недельными проданными итогами для каждого элемента за последнее произвольное количество недель?Как суммировать записи в Rails 3?

У меня есть файл модели:

#items_sold.rb 
class ItemsSold < ActiveRecord::Base 
    attr_accessible :magazines, :books, :videos, :greeting_cards, :pens, :sold_date 

end 

Моя таблица определяется следующим образом:

t.integer :magazines 
t.integer :books 
t.integer :videos 
t.integer :greeting_cards 
t.integer :pens 
t.datetime :sold_date 

Кроме того, можно ли вернуть месячные суммы за последний год, тоже?

ответ

0

См ActiveRecord::Calculations#sum

by_week = (1...10).inject({}) do |wh, weeks_ago| 
    startat = weeks_ago.weeks.ago 
    endat = (weeks_ago - 1).weeks.ago 
    wh[weeks_ago] = [:magazines, :books, :videos, :greeting_cards, :pens].inject({}) do |sh, attr| 
    sh[attr] = ItemsSold.where("sold_date > ? and sold_date <= ?", startat, endat).sum(attr.to_s) 
    sh 
    end 
    wh 
end 

Это будет возвращать хэш как {1 => {:magazines => 5, :books => 33, ...}, 2 => {{:magazines => 13, :books => 28, ...}}, ...}, где каждый ключ номер недели (1 для этого на прошлой неделе, 2 в течение двух недель назад, и т.д ..) и значение другой хэш с суммами.

+0

Огромное спасибо, можно ли получить итоговые значения за каждую неделю, а затем помещать каждую неделю как хэш с массивом? Я думаю, что ваш пример дает итоговые данные за последние 5 недель, а не разбивает их на неделю. – Chanpory

+0

@GeekActive, конечно, вы можете. Просто настройте условия на сумму ItemSold. Я обновил приведенный выше пример, чтобы показать вам, как он может работать. Я точно не знаю структуру данных, которую вы ищете, но вы правильно поняли идею? Просто используйте циклы, чтобы определить, как вы хотите сегментировать данные на основе дат, а затем используйте 'ItemsSold.sum (attr, date_conditions)' для получения сумм. –

+0

@GeekActive, альтернативно, в меньшем количестве запросов вы можете получить номер недели для даты с помощью функции mysql и сгруппировать по ней. Но это намного сложнее, чем использование ruby ​​для выполнения вашей работы, и не должно быть необходимым, если вы не обнаружите, что рубин медленный, потому что массивные массивы данных должны оптимизироваться по запросам. –

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