2010-08-13 6 views
0

Voici la configuration:conditions named_scope et décalage de fuseau horaire

end_date = DateTime.parse('2010-01-01 12:00:00-04') 

et il est parfois initialisés:

end_date = 1.days.ago 

La question ... faire ces named_scope (s) génèrent le même EXACT SQL?

named_scope :before, lambda { |end_date| 
    { :conditions => 
      ["overdraft_transaction_payments.created_at < ?", end_date] } 
} 

et

named_scope :before, lambda { |end_date| 
    { :conditions => 
      ["overdraft_transaction_payments.created_at < ?", end_date.utc] } 
} 

Dans le premier exemple que j'utilise date_fin et dans le second que j'utilise end_date.utc.

(Il peut être important de noter que ... Le système d'exploitation du serveur de base de données est défini sur CDT et la base de données utilise le protocole UTC en interne.Le système d'exploitation du serveur de rails est défini sur CDT. que ce n'est probablement pas la manière optimale de configurer ces systèmes, cependant, la question à portée de main est la sortie ActiveRecord.)

Pour ce que cela vaut la peine mon intuition dit que le premier exemple va générer une chaîne de temps pour le TZ locale où la seconde va générer un UTC-0. PS: Y at-il un mini cas de test que je peux utiliser pour valider mon intuition?

Répondre

1

Je crois sous le capot de la date va être converti avec un appel à « .to_s (: db) » et vous pouvez le voir dans une session de console CISR ce qui va revenir:

>> DateTime.parse('2010-01-01 12:00:00-04').to_s(:db) 
=> "2010-01-01 12:00:00" 
>> DateTime.parse('2010-01-01 12:00:00-04').utc.to_s(:db) 
=> "2010-01-01 16:00:00" 
>> 1.days.ago.to_s(:db) 
=> "2010-08-12 18:01:09" 
>> 1.days.ago.utc.to_s(:db) 
=> "2010-08-12 18:01:13" 
+0

De votre exemple # 1 il ressemble à ".to_s (: db)" ne considérerait pas TZ dans le cadre de la mise en forme. – Richard

+0

La leçon apprise ... lorsque les fuseaux horaires sont si fous, assurez-vous d'utiliser le .to_s (db) explicitement dans votre SQL. – Richard