Это решение является быстрым и грязным, и может иметь некоторые проблемы с производительностью. Я предлагаю потенциальную оптимизацию ниже.
Предполагая, что модель продукта со следующей схемой,
# Table name: products
#
# id :integer not null, primary key
# name :string
# amount :float
# quantity :integer
# created_at :datetime not null
# updated_at :datetime not null
в models/product.rb
:
class Product < ActiveRecord::Base
def self.group_by_day
# queries the database
self.all.group_by { |p| p.created_at.beginning_of_day }
# if you're using a different date field, replace 'created_at' with that field.
end
def self.quantity_by_day
# returns an array of hashes, each containing the date and quantity
quantity_array = []
self.group_by_day.each do |day, products|
quantity_array << {
date: day.to_s(:db),
quantity: products.map(&:quantity).sum
}
end
quantity_array
end
def self.group_by_week
self.all.group_by { |p| p.created_at.beginning_of_week }
end
def self.quantity_by_week
# ...
end
def self.group_by_month
self.all.group_by { |p| p.created_at.beginning_of_month }
end
def self.quantity_by_month
# ...
end
end
Product.quantity_by_day.to_json
даст вам данные, которые вы можете использовать для диаграммы. Вот диаграмма JSFiddle диаграммы HighCharts с использованием данных. ( Я не знаю, почему даты по оси X не работают для меня, но диаграмма отображается правильно. Редактирование: исправлено.)
Как я уже говорил ранее, Ruby неэффективен. Я бы посоветовал:
- Используя PostgreSQL вместо SQLite, используйте жемчужину groupdate. Это использует SQL для группировки записей, что намного быстрее. SQLite не имеет хорошую поддержку даты, поэтому мы должны использовать
group_by
- Кроме того, посмотреть SO question about grouping by week/month in SQL
Наконец, показывая ваши продукты схемы таблицы поможет нам придумать более конкретный ответ.