分配创建日期的每日销售额

时间:2016-09-25 13:12:16

标签: ruby-on-rails ruby ruby-on-rails-5

我试图收集一周内完成的所有销售,并在每天进行销售。如果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)

我得到的两个日期(正确),其中每个数据只有一个对象,每个日期应该是两个或更多。有什么不对吗?

1 个答案:

答案 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方法