我可以定期重新计算给定的时间间隔后的属性?(Can I periodically recalcula

2019-10-21 11:29发布

我有一个模型“用户”,具有浮动属性“值”。 我想每个用户的贬值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,如果该事项。

Answer 1:

随着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首次的值)。



文章来源: Can I periodically recalculate an attribute after a given time interval?