我可以在给定的时间间隔后定期重新计算属性吗?

时间:2014-12-23 11:17:28

标签: ruby database ruby-on-rails-4 model attributes

我有一个模型“User”,浮动属性为“Value”。我希望每个用户的值在用户创建后每24小时折旧1%(即,乘以0.99)。例如,如果在1月1日02:34创建用户值为5,然后在1月2日02:34创建用户,则应将其值重新计算为4.95。然后在1月3日02:34,它应重新计算为4.9005,依此类推。

可以这样做吗?

如果重要的话,我正在使用Rails 4.0.10应用程序。

1 个答案:

答案 0 :(得分:0)

使用delayed_job gem,您可以执行以下操作:

# 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。虽然Cron解决方案更容易维护,但最终可能会在早期或晚期降低值(想象一下,用户是在晚上11点创建的,一小时后Cron任务开始首次降低该值)。