我有一个模型“用户”,具有浮动属性“值”。 我想每个用户的贬值1份%(即0.99相乘)用户的创建后,每24小时。 例如,如果一个用户相关的5在2点34分1月1日的值,生成,则在2点34分1月2日,它的值应该重新计算为4.95。 随后,在02:34 1月3日,应重新计算为4.9005,等等。
可以这样做?
我使用一个Rails应用程序4.0.10,如果该事项。
我有一个模型“用户”,具有浮动属性“值”。 我想每个用户的贬值1份%(即0.99相乘)用户的创建后,每24小时。 例如,如果一个用户相关的5在2点34分1月1日的值,生成,则在2点34分1月2日,它的值应该重新计算为4.95。 随后,在02:34 1月3日,应重新计算为4.9005,等等。
可以这样做?
我使用一个Rails应用程序4.0.10,如果该事项。
随着delayed_job的宝石,你可以做这样的事情:
# in user.rb
after_create :decrease_value_periodically
private
def decrease_value_periodically
self.value = value * 0.99
self.save!
decrease_value_periodically if value > 0
end
handle_asynchronously :decrease_value_periodically,
:run_at => Proc.new { 24.hours.from_now }
此示例将创建一个用户后24小时运行,并会重新安排自己一遍又一遍。
另一种选择可能是一个日常的Cron任务在同一时间(午夜例如)重新计算所有用户的价值。 你可以设置一个运行Rails的方法,这样一个cron任务:
# command for Cron
rails runner "User.recalculate_all_values"
# in user.rb
def self.recalculate_all_values
User.all.each { |user| user.decrease_value }
end
private
def decrease_value
if value > 0
self.value = value * 0.99
self.save!
end
end
IMO它取决于你的工作重点:如果你想在24小时后精确的运行,选择delayed_jobs。 尽管克龙的解决方案更易于维护,但你最终可能会随值早或晚(想象一下,一个用户在晚上11点创建和一小时后的定期任务开始decrase首次的值)。