условия named_scope и несоответствие часовых поясов - PullRequest
0 голосов
/ 13 августа 2010

Вот настройки:

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

и иногда он инициализируется:

end_date = 1.days.ago

Вопрос ... генерируют ли эти named_scope одинаковые EXACT SQL?

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

и

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

В первом примере я использую end_date, а во втором я использую end_date.utc.

(Может быть важно отметить .... ОС сервера БД установлена ​​на CDT, а БД использует UTC для внутреннего использования. Операционная система сервера рельсов установлена ​​на CDT, а экземпляр приложения - на EDT. Я понимаю, что это, вероятно, не оптимальный способ настройки этих систем, однако проблема заключается в выводе ActiveRecord.)

Для чего это стоит, моя интуиция говорит, что первый пример будет генерировать строку времени для локального TZ, где второй будет генерировать UTC-0.

PS: Есть ли мини-тест для проверки моей интуиции?

1 Ответ

1 голос
/ 13 августа 2010

Я полагаю, что скрытая дата будет конвертирована с помощью вызова ".to_s (: db)", и вы можете увидеть в сеансе консоли IRB, что это будет возвращать:

>> 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"
...