2011-01-05 6 views
7

Können sagen, ich habe ein cronjob wie folgt aus:Rails dynamische Werte

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

Obwohl, ich möchte machen ‚1.day‘ dynamischer, wie das Ändern der Wert über ein Formular in eine Verwaltungsseite.

Dann könnte es so aussehen:

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

oder

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

Kann jemand kommen mit einer Idee, wie diese Arbeit zu machen?

Offensichtlich ist der Grund dafür wäre, dass ich die in der Datenbank auf meiner Website gespeicherten Werte verwenden könnte, wie eine SMS-Nachricht:

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

Antwort

8

Ich habe nie versucht, aber Sie sollten in der Lage sein zu tun, Dazu laden Sie die Rails-Umgebung so oft, dass Sie Ihre Modellklassen verwenden können. Verwenden Sie einfach require File.dirname(__FILE__) + "./environment" (oder "./application" für Rails 3) in Ihrem schedule.rb, vorausgesetzt, Ihr schedule.rb befindet sich im Konfigurationsverzeichnis.

Da jedoch immer, wenn immer Zeilen in der Crontab generiert werden, würden alle Änderungen an Constant erfordert whenever --update-crontab wieder ausgeführt werden.

10

Danke Leerlauffinger! Es hat total funktioniert. Hier ist meine Lösung:

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 zum Beispiel enthalten: 1.day oder : Sonntag
.additional_data enthält den Zeitstempel, Beispiel: 11.00

Und ja, Ich bin mir bewusst, dass ich --update crontab wieder ausführen muss :)
Aber ich werde ein Cronjob selbst aktualisieren, hehe.

+0

Das in Rails4 funktioniert nicht. Die Anweisung require funktioniert nicht. irgendeine Idee, was muss ich ändern? – ShivamD

+1

Ich habe Rails 4 selbst noch nicht ausprobiert, aber ich denke RAILS_ROOT wurde in Rails.root geändert. – Frexuz

+0

@Frexuz: Was bedeutet diese Linie, kannst du mir helfen, sie los zu werden? notification_weekly = Constant.find_by_key ("notification_weekly_time_span") - auch was ist 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 

Vergessen Sie nicht, für mich zu aktualisieren, wenn

+0

Ich benutze auch Rails 4, 'require" # {RAILS_ROOT} /config/environment.rb "' funktioniert hier gut. – Frexuz

+0

Danke, aber ich habe dieses Problem angegangen und von oben gelöst. – Mukesh