2010-10-26 4 views
6

Je sais que c'est une mauvaise idée, mais j'ai beaucoup de code hérité et je veux exécuter quelques travaux par lots historiques. Je ne veux pas changer la date du système parce que d'autres choses fonctionnent sur le même système. Est-il possible que je puisse changer la valeur que Date.today retournera pour la vie d'un processus donné seulement. L'idée ici est de rembobiner et d'exécuter certains anciens scripts batch qui ont été utilisés pour fonctionner avec Date.today.comment modifier la valeur de Date.today dans un processus ruby ​​en cours d'exécution

grâce Joel

Répondre

6

Vous pouvez soit Ruby-patch de singe comme Nikolaus vous a montré, ou pouvez utiliser la gemme TimeCop. Il a été conçu pour faciliter les tests d'écriture, mais vous pouvez également l'utiliser dans votre code normal.

# Set the time where you want to go. 
t = Time.local(2008, 9, 1, 10, 5, 0) 

Timecop.freeze(t) do 
    # Back to the future! 
end 
# And you're back! 

# You can also travel (e.g. time continues to go by) 
Timecop.travel(t) 

C'est un excellent morceau de code. Essayez-le, cela vous évitera des maux de tête lorsque vous saisirez vous-même la date et l'heure.

Lien: https://rubygems.org/gems/timecop

+0

+1 pour TimeCop! – Jonathan

+0

oh cool, j'aime encore mieux! – Joelio

0

vous pouvez redéfinir la classe méthode 'aujourd'hui' de la classe Date

class Date 
    def Date.today 
    return Date.new(2000,1,1) 
    end 
end 

ce fixerait Date.today au 2000-01-01.

+0

frais ok, où dois-je mettre ce code. J'ai une application rails, mon fichier batch fonctionne comme une tâche rake. Comment puis-je m'assurer que seule la tâche rake inclut ce code. Est-ce que je viens de le mettre dans la tâche de râteau lui-même? – Joelio

+0

en l'incluant dans la tâche rake devrait fonctionner correctement –

0

Si la redéfinition Date.today semble trop aki, vous pouvez essayer delorean

Sur la page GitHub:

require 'delorean' 

# Date.today => Wed Feb 24 
Delorean.time_travel_to "1 month ago" # Date.today => Sun Jan 24 
Delorean.back_to_the_present   # Date.today => Wed Feb 24