如何计算更新rails中列的到期时间

时间:2014-01-08 04:16:25

标签: ruby-on-rails ruby cron

我正在试图找出计算用户订阅剩余天数的正确方法。

例如;用户在2013年12月25日签署了一个月并于2013年12月29日取消订阅。即使他在订阅后4天取消订阅,他的订阅也应在未来27天(基于月份的31天)的计划A上运行。

我想我会使用created_at和updated_at的订阅模型。到目前为止,我已经

** MODEL:subscription.rb

class Subscription < ActiveRecord::Base

    before_save :set_expiry_date

    def set_expiry_date
        @remaining_days = Subscription.calculate(:created_at - Date.today)
        Subscription.expiry = '@remaining_days'
        Subscription.save
    end

end

这样的东西,但我在这里遗漏了一些东西,这可能是一个丑陋的方法。我猜这给了任何能够帮助我理解我所追求的东西的人。

然后我会在23:59每天运行一个rake作为cron,从那里删除Precription.expiry号码中的1(天),当它找到0时,它会更新一些东西。这是另一个问题,但是我放了关于rake cron的东西,所以你看到我要去哪里。

1 个答案:

答案 0 :(得分:4)

如果这是我的项目,我会采取不同的方法。我会将订阅到期时间设置为实际的到期日期而不是递减的整数。这减少了对cron的工作量,也感觉就像是一个很好的约会练习。 。 。您可以获得在到期后保持到期日期的好处,这对于以后的数据分析可能很方便。如果你的程序中有错误或你的cron无法运行怎么办?通过坚持约会,你可以做一些详细的家庭作业或重新运行你的crons特定群组。

如果我需要知道订阅UI或API响应的剩余天数,我可以在订阅类上调用类似于下面的remaining_days方法的方法:

def set_expiry_date
    #automatically adds a month
    #http://ruby-doc.org/stdlib-2.1.0/libdoc/date/rdoc/Date.html#method-i-next_month
    Subscription.expiry_date = Subscription.created_at.next_month
    Subscription.save
end

def remaining_days
    expired? ? 0 : (Date.today - Subscription.expiry_date).to_i
end

def expired?
  (Date.today - Subscription.expiry_date).to_i <= 0   
end

def expired_today?
  Date.today == Subscription.expiry_date
end

然后,我的每日cron在到期时做了一些事情(发送电子邮件恳求客户回来?)只会查找expired_today的订阅? ==是的。我的cron也会忽略在今天之前过期或尚未过期的订阅。