gpt4 book ai didi

ruby-on-rails - 计算不间断天数的最佳方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:50 24 4
gpt4 key购买 nike

在我的应用程序中,用户有很多手势。计算用户完成手势的后续天数的好方法是什么?

现在我正在按照下面的方式进行操作,并且它按我想要的方式工作。但显然它无法扩展。

class User < ActiveRecord::Base

# ...

def calculate_current_streak
return 0 unless yesterday = gestures.done_on_day(Date.today-1)
i = 0
while gesture = self.gestures.done_on_day(Date.today - (i+1).days).first
i += 1
end
i += 1 if gestures.done_on_day(Date.today).first
i
end

end

谢谢!特别指出那些可以以仅跟踪工作日的方式工作的人:)

最佳答案

这样想:

连续的长度等于自上次(工作)日用户完全不使用手势以来经过的(工作)天数,对吧?

因此,解决方案归结为计算用户未做出手势的最近一天。

为了最轻松地做到这一点,许多数据库管理员使用了一个技巧:他们使用所有 日期(例如,从 2000 年到 2100 年的所有日期)创建数据库表。该表需要只有日期字段,但您可以放入一个 bool 字段来标记非工作日,例如周末和假期。这样的表在大量查询中可以派上用场,而且您只需创建并填充一次。 (Here's 一篇关于此类表的更详细的文章,为 MS SQL 编写,但无论如何都很有见地。)

有了这个表(我们称它为 dates),您可以使用类似(伪 SQL)的方法来计算您的 pre-streak 日期:

SELECT d.date
FROM dates d
LEFT JOIN gestures g ON d.date = g.date AND g.user_id = <put_user_id_here>
WHERE d.date < TODAY() AND g.date IS NULL AND d.work_day = TRUE
ORDER BY d.date DESC
LIMIT 1

关于ruby-on-rails - 计算不间断天数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com