2011-01-05 3 views
7

Diciamo che ho un cronjob come questo:Rails - Ogni volta gioiello - valori dinamici

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

Anche se, mi piacerebbe fare '1.day' più dinamica, come ad esempio la modifica del valore tramite un modulo in una pagina di amministrazione.

Allora potrebbe assomigliare a questo:

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

o

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

chiunque può venire con un'idea su come fare questo lavoro?

Ovviamente, la ragione di questo sarebbe che ho potuto utilizzare i valori memorizzati nel database sul mio sito, come un messaggio che dice

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

risposta

8

Non ho mai provato, ma si dovrebbe essere in grado di fare questo caricando l'ambiente Rails in ogni momento in modo da poter utilizzare le classi del modello. Basta usare require File.dirname(__FILE__) + "./environment" (o "./application" per Rails 3) nel tuo schedule.rb, assumendo che schedule.rb si trovi nella directory di configurazione.

Tuttavia, poiché tutte le volte che viene generato da linee in crontab, qualsiasi modifica apportata a qualsiasi Constant richiederebbe l'esecuzione di whenever --update-crontab di nuovo.

10

Grazie idlefingers! Ha funzionato completamente. Ecco la mia soluzione:

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 può contenere per esempio: 1.day o : domenica
.additional_data contiene il timestamp, ad esempio: 11:00

E sì, Sono consapevole che ho bisogno di eseguire --update crontab di nuovo :)
Ma lascerò che un cronjob si aggiorni da solo, hehe.

+0

che non funziona per me in Rails4. La dichiarazione require non funziona. Qualche idea di cosa ho bisogno di cambiare? – ShivamD

+1

Non ho ancora provato Rails 4, ma penso che RAILS_ROOT sia cambiato in Rails.root. – Frexuz

+0

@Frexuz: cosa significa questa linea, puoi aiutarmi a liberarmene. notification_weekly = Constant.find_by_key ("notification_weekly_time_span") - anche cosa è notification_weekly_time_span – SSR

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 

Non dimenticare di aggiornare ogni volta

+0

Anche io uso le rotaie 4, 'richiede" # {RAILS_ROOT} /config/environment.rb "' funziona bene qui. – Frexuz

+0

Grazie, ma ho affrontato questo problema e risolto sopra. – Mukesh