我有一个模型“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应用程序。
答案 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任务开始首次降低该值)。