Rails - 每当宝石 - 动态值

Fre*_*xuz 8 ruby cron gem ruby-on-rails whenever

可以说我有这样的cronjob:

every 1.day, :at => '4:30 am' do  
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"  
end  
Run Code Online (Sandbox Code Playgroud)

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

然后它可能看起来像这样:

every Constant.find(2).value, :at => '4:30 am' do 
Run Code Online (Sandbox Code Playgroud)

要么

@const = Constant.find(2)
every @const.span, :at => @const.time do 
Run Code Online (Sandbox Code Playgroud)

任何人都可以想出如何使这项工作?

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

<%= "The next update is in less than #{@const.time}" #or something similar %>
Run Code Online (Sandbox Code Playgroud)

Fre*_*xuz 10

谢谢你的空闲!它完全奏效了.这是我的解决方案:

require "#{RAILS_ROOT}/config/environment.rb"

@notification_daily = Constant.find_by_key("notification_daily_time_span")
every eval(@notification_daily.value), :at => @notification_daily.additional_data do
  runner "Notification.daily"
end

@notification_weekly = Constant.find_by_key("notification_weekly_time_span")
every eval(@notification_weekly.value), :at => @notification_weekly.additional_data do
  runner "Notification.weekly"
end
Run Code Online (Sandbox Code Playgroud)

.value可以包含例如:1.day:sunday
.additional_data包含时间戳,例如:上午11:00

是的,我知道我需要再次运行--update crontab :)
但是我会让cronjob更新自己,呵呵.


idl*_*ers 8

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

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


Muk*_*esh 7

# 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
Run Code Online (Sandbox Code Playgroud)

不要忘记随时更新