Rails-Whenever gem-динамические значения

допустим, у меня есть такая работа:

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

хотя, я хотел бы сделать '1.день " более динамичный, например, изменение значения через форму на странице администрирования.

тогда это может выглядеть так:

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 %>

3 ответов


Я никогда не пробовал, но вы должны быть в состоянии сделать это, загрузив среду Rails во всякий раз, когда вы можете использовать свои классы моделей. Просто используйте require File.dirname(__FILE__) + "./environment" (или "./application" для рельсов 3) в вашем расписании.rb, предполагая ваше расписание.РБ в папку с настройками.

однако, поскольку все, когда это происходит, генерирует строки в crontab, любые изменения, внесенные в any Constant потребует выполнения whenever --update-crontab снова.


спасибо idlefingers! Это сработало. Вот мое решение:

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

.значение может содержать например: 1.день или в воскресенье
.additional_data содержит метку времени, например: 11:00 часов

и да, я знаю, что мне нужно работать --обновить crontab еще раз:)
Но я позволю cronjob обновить себя, хе-хе.


# 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

Не забудьте обновить, когда