2009-12-29 7 views
0

J'implémente le support Timezone dans Rails 2.1+, et j'ai rencontré un bug apparent dans la façon dont les données sont extraites de la base de données. Laissez-moi essayer de le mettre en place.Rails timezone ignoré pour ActiveRecord trouver?

Le modèle "deals" contient un champ datetime "offer_date". Disons que j'ai deux dossiers avec ces offer_dates:

Deal 1: 2009-12-29 23:59:59 -0500 
Deal 2: 2009-12-28 23:59:59 -0500 

Ceci est correct: les dates devraient marquer la dernière seconde de sa journée.

Maintenant, quand vient le temps de trouver l'accord d'aujourd'hui, je la requête AR suivante:

@deal = Deal.first(:conditions=>['offer_date > ?', Time.now.beginning_of_day], :order=>"offer_date ASC") 

Dans ce cas, bien que ce soit le 29 aujourd'hui, il renvoie le dossier ostensiblement pour le 28. Pourquoi? Voici ce qui se passe dans la console:

>> @deal = Deal.first(:conditions=>['offer_date > ?', Time.now.beginning_of_day], :order=>"offer_date ASC") 
=> #<Deal id: 2, <blah blah blah...>, offer_date: "2009-12-29 04:59:00"> 

Il est décalant le temps avant de 5 heures, en mettant la journée d'hier dans l'autre. Mais quand je fais ceci:

>> @deal.offer_date 
=> Mon, 28 Dec 2009 23:59:00 EST -05:00 

Je reçois le bon moment. Que diable??? Inutile de dire que j'ai besoin de cette date pour fonctionner correctement, mais je n'arrive pas à comprendre où est mon problème. Toute aide que vous pourriez fournir serait grandement appréciée!

Répondre

1

Voir mes prior rsponse sur Time. Time.zone pour les requêtes de date AR.

+0

Ahhh, merci encore pour votre aide! Je vais finir par ça ... :-) –

0

Au lieu d'utiliser Time.now, essayez d'utiliser Time.zone.now

Bien sûr, vous devez définir cela et tout. This tutorial semble utile.

0

le temps classe ne se soucient pas du fuseau horaire dans la mise en œuvre de #to_s, donc vous devez utiliser

Time.zone.now # or any other TimeWithZone object 

dans vos Finders/named_scopes/trouver des appels. Ou vous pouvez lire http://marklunds.com/articles/one/402 puis mettre

module ActiveRecord 
    module ConnectionAdapters # :nodoc: 
    module Quoting 
     # Convert dates and times to UTC so that the following two will be equivalent: 
     # Event.all(:conditions => ["start_time > ?", Time.zone.now]) 
     # Event.all(:conditions => ["start_time > ?", Time.now]) 
     def quoted_date(value) 
     value.respond_to?(:utc) ? value.utc.to_s(:db) : value.to_s(:db) 
     end 
    end 
    end 
end 

dans votre environment.rb ou dans un initialiseur.

Questions connexes