在 Rails 上按日期分组,然后按城市分组

时间:2021-04-20 00:25:56

标签: ruby-on-rails ruby api activerecord

我有一个 api,它的输出必须是这样的:

[
  {
    "store": "store",
    "date": "2020/05/03",
    "address": {
       "city": "city1"
       "address_line_1": "address"
     },
    "sales_count": 10,
  },
  {
    "store": "store",
    "date": "2020/05/03",
    "address": {
       "city": "city2"
       "address_line_1": "address"
     },
    "sales_count": 21,
  },
]

我知道如何处理分组和销售计数,但我在按城市分组时遇到问题

Store.first.sales.group(:date).count 将是 sales_count,但我不确定如何按地址包含组。

考虑到地址 = Store.first.sales.first.address

这意味着一家商店有很多销售,每个销售都有一个地址。

1 个答案:

答案 0 :(得分:0)

由于您不仅要统计销售额,还要返回数据,因此您应该更喜欢 PARTITION BY 而非 GROUP BY。 您可以PARTITION BY组合日期、地址:

SELECT store, date, address, 
COUNT(sales) OVER (PARTITION BY date, address) AS sales_count
FROM _

除此之外,如果你对数据什么都不做而是返回它们,那么最好的做法是直接从适配器调用 sql(这样我们避免创建 ActiveRecord 模型对象导致各种内存争用问题)

result = ActiveRecord::Base.connection.execute(
 "SELECT store, date, address, 
  COUNT(sales) OVER (PARTITION BY date, address) AS sales_count 
  FROM _"
)
result.each do |msg|
 # json serialize ???
end
相关问题