2016-09-25 3 views
1

Im пытается собрать все продажи в течение недели и поставить каждую продажу в день. Если Moday был двумя продажами, то Monday => {...}, {...} и т. Д.Выделить ежедневные продажи на сегодняшний день

«Понедельник» будет форматом даты рубина.

В моем db у меня есть 5 объектов продажи: два продаж в понедельник и два во вторник.

Контроллер:

def daily_customer_sale(created) 
    date_and_id = Sale.where('created_at >= ?', created).pluck(:created_at, :id) 
    date_and_id.each do |obj| 
    yield(obj.first, obj.last) 
    end 
end 

def daily_sales(created=nil) 
    sales_by_date = Hash.new(0) 

    daily_customer_sale(created) do |date, id| 
    s_date = date.to_date 
    sales_by_date[s_date] = Sale.find(id) # Seems to return only one object per day 
    end 

    return sales_by_date 
end 

Для просмотров:

daily_sales(1.week.ago.to_datetime) 

Что я получаю в двух дат (правильных), в котором каждый из данных имеет только один объект, когда он должен быть два или больше за день. Здесь что-то не так?

ответ

4

Для этого вам не нужна сложная логика. Вот более чистый способ

Sale.where('created_at >= ?', created_at).group_by{ |sale| sale.created_at.to_date} 

Он вернет все продажи, сгруппированные по дням. key будет объектом даты, и на каждый день будет продаваться массив, содержащий все продажи за этот день.

Если вам нужен ключ, основанный string вы можете отформатировать его, как вам нравится, как на ниже

Sale.where('created_at >= ?', created_at).group_by{ |sale| sale.created_at.to_date.to_s } #default date format 

Sale.where('created_at >= ?', created_at).group_by{ |sale| sale.created_at.to_date.strftime("%d/%m/%Y") } #23/09/2016 

Вы можете посмотреть на Group by метод

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