我试图收集一周内完成的所有销售,并在每天进行销售。如果Moday是两个销售,那么Monday => {...}, {...}
等
“星期一”将是ruby的日期格式。
在我的数据库中,我有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)
我得到的两个日期(正确),其中每个数据只有一个对象,每个日期应该是两个或更多。有什么不对吗?
答案 0 :(得分: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方法