我已经设置了一个订阅计划,该计划将每月,每三个月和每年自动向用户收费。问题是,如何计算向用户收费的确切日期?我们不能每30天收费一次吗?因为并非所有月份都有30天。如果我们按购买日期收取费用,那么在1月30日购买该计划的人将不会在2月份收取费用,因为2月份没有30。这是一个复杂的问题。我该如何解决这个问题?
PS:我在铁轨上使用红宝石
答案 0 :(得分:8)
您可以存储subscribed_on
日期和用户已设置的number_of_payments
。然后在日期增加number_of_months
并使用>>
方法计算下一个付款日期。 >>
将一个月内的天数考虑在内:
# at subscription date and first payment
subscribed_on = Date.today # in this example: 2015-01-30
number_of_payments = 1
next_payment_date = subscribed_on >> number_of_payments
#=> 2015-02-28
# after next payment (on 2015-02-28)
number_of_payments = number_of_payments + 1
next_payment_date = subscribed_on >> number_of_payments
#=> 2015-03-30
# after next payment (on 2015-03-30)
number_of_payments = number_of_payments + 1
next_payment_date = subscribed_on >> number_of_payments
#=> 2015-04-30
来自Date#>>
d >> n
→date
返回
n
之后指向self
个月的日期对象。n
应为数值。
这不仅可以返回正确的日期,还可以优化next_payment_date
的查询和统计数据,例如以月为单位的平均订阅时长。