【发布时间】:2017-11-23 10:26:07
【问题描述】:
我正在运行一个查询,该查询使用 GroupBy gem 按天对数据库中过去三天(包括今天)的记录活动存在的天数进行分组。这是完整的查询:
Record.activities.where("created_at >= ?", 2.days.ago.beginning_of_day.in_time_zone).group_by_day(:created_at).count.count
2 天前,我有 1 个活动,昨天我有 0,今天我有 2。这应该返回 2(不是 3,它计算天数而不是活动)但由于某种原因它返回 3。更奇怪的是如果我将2.days.ago 更改为1.day.ago 或0.days.ago,它会返回正确的值1。它会忽略没有活动的昨天,只计算它识别出有活动的那一天(今天)。
如果我删除第二个 .count,这就是它为 2.days.ago 返回的内容...
{Tue, 21 Nov 2017=>1, Wed, 22 Nov 2017=>0, Thu, 23 Nov 2017=>2}
如果我为1.day.ago 运行它,我会得到...
{Thu, 23 Nov 2017=>2}
这是 2.days.ago 查询的原始 SQL。
SELECT COUNT(*) AS count_all, strftime('%Y-%m-%d 00:00:00 UTC', created_at)
AS strftime_y_m_d_00_00_00_utc_created_at
FROM "activities"
WHERE "activities"."goal_id" = ? AND (created_at >= '2017-11-21 00:00:00')
AND (created_at IS NOT NULL)
GROUP BY strftime('%Y-%m-%d 00:00:00 UTC', created_at)
经过更多测试,我注意到如果x.days.ago 中的 x 落在 0 的那一天,它只会忽略 0 活动的一天。如果 0 活动的日子超过 1 天,它将忽略第一个作为它应该然后用 0 来计算其他日子......
不确定我在这里遗漏了什么,但希望能帮助您找到问题。
如果您需要更多信息,请告诉我。
【问题讨论】:
-
你为什么
count两次? -
Jut 更新了问题,以便您可以看到第二个问题的作用,但基本上第二个
count计算返回的哈希数。 -
我的第一个冲动是你在某处使用 count 但你应该使用 sum。如果您添加原始 MySQL 查询,我可以进一步评论。
-
刚刚更新了包含原始 SQL 的问题
-
原始查询是否给您预期的结果?
标签: mysql ruby-on-rails activerecord