2015-05-26 3 views
2

В моей таблице Sqlite у меня есть более чем 5-летние отчеты по цене и количеству Продукта. Теперь я пытаюсь отображать данные в High Charts. Для части Filtration я помещаю 4 переключателя i.e, день, неделю, месяц и год.Rails 4 + Фильтрация данных по дням, неделям, месяцам и годам в HighCharts

Если пользователь нажимает кнопку «День», то график должен отображать данные дня. Если пользователь нажимает кнопку «Неделя», тогда график должен отображать недельное расчетное значение и так далее.

Теперь я не получаю способ реализовать его. Я пытаюсь реализовать код фильтра в MODEL.

enter image description here

Пожалуйста, предложите что-то, как действовать.

ответ

2

Это решение является быстрым и грязным, и может иметь некоторые проблемы с производительностью. Я предлагаю потенциальную оптимизацию ниже.

Предполагая, что модель продукта со следующей схемой,

# 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

Наконец, показывая ваши продукты схемы таблицы поможет нам придумать более конкретный ответ.

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