将每日销售额分配到创建日期

Allocate daily sales to date created

我正在尝试收集一周内的所有销售额,并将每笔销售额放在销售额中。如果 Moday 是两次销售,则 Monday => {...}, {...}

"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)

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

你不需要复杂的逻辑来做到这一点。这是一个更简洁的方法

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

它将return所有销售额按天分组。 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方法