Rails - 每当宝石 - 动态值

时间:2011-01-05 09:19:05

标签: ruby-on-rails ruby cron gem whenever

假设我有这样的cronjob:

every 1.day, :at => '4:30 am' do  
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"  
end  

虽然,我想让'1.day'更具动态性,例如通过管理页面中的表单更改值。

然后它看起来像这样:

every Constant.find(2).value, :at => '4:30 am' do 

@const = Constant.find(2)
every @const.span, :at => @const.time do 

任何人都可以提出如何使这项工作的想法吗?

显然,这样做的原因是我可以使用我网站上数据库中存储的值,就像消息说的那样

<%= "The next update is in less than #{@const.time}" #or something similar %>

4 个答案:

答案 0 :(得分:10)

答案 1 :(得分:8)

我从来没有尝试过,但你应该能够通过加载Rails环境来实现这一点,以便你可以使用你的模型类。假设您的schedule.rb位于配置目录中,只需在schedule.rb中使用require File.dirname(__FILE__) + "./environment"(或"./application"用于Rails 3)。

但是,由于无论何时都在crontab中生成行,因此对任何Constant所做的任何更改都需要再次运行whenever --update-crontab

答案 2 :(得分:6)

# In rails 4
require File.expand_path('../..//config/environment.rb', __FILE__)

# This is your table by which you will get your new value 
bid_update = DynamicOfferTime.first

# Now Task As
every (bid_update.hour_value).hours do
  puts "This will repeat in every #{bid_update.hour_value} hour"
end

不要忘记每当

更新

答案 3 :(得分:1)

我有相同的任务,因此决定用另一种方法解决它。 在我的表中有很多记录,这些记录存储计划的设置 (每天,每月,每周,时间)

schedule.rb文件中,我添加了一个cron作业,该作业每天在00:00运行,并选择可以在今天运行的记录。然后将其添加到使用perform_at与sidekiq排队。