#ruby-on-rails #ruby #ruby-on-rails-3 #locale #ruby-enterprise-edition
#ruby-on-rails #ruby #ruby-on-rails-3 #язык #ruby-enterprise-edition
Вопрос:
На моем VPS (Ubuntu 10.04LTS) у меня установлены ree-1.8.7-2011.03 и ruby-1.9.2-p180 через RVM. Моя проблема в том, что когда я вызываю Time.now в ree-1.8.7 (irb), я получаю Thu May 12 12:16:50 0200 2011
, когда я делаю то же самое в ruby-1.9.2 (irb), я получаю 2011-05-12 12:17:44 0200
.
Проблема в том, что ree-версия даты непригодна для использования в моих запросах rails (Сгенерированный SQL просто не работает). Форматирование времени с использованием strftime в каждом отдельном запросе на данный момент невозможно, и ни один из них не переходит на 1.9.2, поэтому мне нужна ваша помощь, чтобы выяснить, почему это происходит, и исправить это.
Спасибо за любую помощь!
Комментарии:
1. Как вы передаете даты в запросы? Вы не используете интерполяцию параметров AR?
2. В большинстве случаев да, но некоторые из более крупных запросов намного легче читать, когда я использую интерполяцию строк.
3. Хорошо, просто помните, что вы также можете использовать
:name
форму с хэшем вместо?
массива. Достаточно читаемый, даже больше, чем обычная интерполяция строк IMO.4. Спасибо, я знал об этом некоторое время, но я еще не использовал его. Я попробую и посмотрю, как это выглядит. Спасибо!
Ответ №1:
Это не проблема REE. Ruby 1.9.2 изменяет формат времени по умолчанию #на_s.
$ rvm use 1.8.7
ruby-1.8.7-p334 :001 > Time.now
# => Thu May 12 12:42:35 0200 2011
$ rvm use 1.9.2
ruby-1.9.2-p180 :001 > Time.now
# => 2011-05-12 12:42:44 0200
Рекомендуется никогда не полагаться на формат Time #to_s по умолчанию, но всегда использовать пользовательский помощник или метод для форматирования выходных данных даты, иначе вы не сможете контролировать, как отображается информация.
Форматирование времени с использованием strftime в каждом отдельном запросе на данный момент не является вариантом
Это не только должно быть опцией, это должно было быть вашим первым выбором. Я настоятельно рекомендую вам исправить существующий код, чтобы использовать пользовательский метод форматирования.
Временным обходным решением было бы переопределить метод Ruby 1.8.7 Time#to_s для использования пользовательского формата. Однако внесение такого изменения может привести к поломке других библиотек.
Комментарии:
1. Спасибо, я вроде как пришел к тому же выводу за последние несколько минут, думал, что понятия не имел об этом изменении между 1.8 и 1.9. Теперь я знаю, что должен использовать strftime, только это был не немедленный вариант.
2. Но есть ли разница между чередованием времени в предложении where с #{Time.now} в строке и выполнением замены «?»?
Ответ №2:
Как насчет чего-то подобного в вашем config / initializers / app.rb
Time::DATE_FORMATS[:default] = "Your preferred date format"
Комментарии:
1. Установка Time::DATE_FORMATS[:default]= «%F %T %Z» в моем инициализаторе не имела никакого эффекта, но неважно, я решил использовать strftime во всех своих запросах, как указано Симоной Карлетти. Спасибо!