2016-09-25 100 views
1

我试图收集所有在一个星期内做出的销售,并把每一天的销售。如果Moday是两个销售,那么Monday => {...}, {...}分配每日销售创建日期

“星期一”将是红宝石的日期格式。

在我的分贝中,我有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方法,你可以将其格式化