Rails - Всякий раз, когда драгоценный камень - Динамические значения - PullRequest
8 голосов
/ 05 января 2011

Допустим, у меня есть такой 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 

Может кто-нибудь придумать, как сделать эту работу?

Очевидно, что причиной этого было бы то, что я мог использовать значения, хранящиеся в базе данных на моем сайте, например, сообщение «1014 *

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

Ответы [ 3 ]

10 голосов
/ 06 января 2011

Спасибо, бездельники! Это полностью сработало. Вот мое решение:

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

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

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

8 голосов
/ 05 января 2011

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

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

7 голосов
/ 26 июня 2015
# 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

Не забывайте обновлять всякий раз, когда

...