计算未破坏天数的最佳方法

时间:2011-03-29 09:49:11

标签: ruby-on-rails ruby activerecord

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

现在我正在按照下面这样做,它按照我的意愿运作。但显然它不会扩展。

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 

谢谢!特别指向能够仅以工作日方式工作的人:)

1 个答案:

答案 0 :(得分:3)

以这种方式思考:

连胜的长度相当于自用户完全没有使用手势的最后(营业日)以来经过的(营业日)天数,对吗?

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

为了最容易地做到这一点,有很多数据库管理员使用的技巧:他们使用所有日期创建数据库表(例如,从2000年到2100年的所有日期)。该表只需要具有日期字段,但您可以输入一个布尔字段来标记非工作日,例如周末和假日。这样的表在 lot 的查询中很方便,你只需要创建并填充一次。 (Here's关于此类表格的更详细的文章,为MS SQL编写,但无论如何都很有见地。)

拥有这个表(让我们称之为dates),您可以使用类似(伪SQL)的方式计算您的预条纹日期:

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