Rails 3: Как устранить несоответствие в формате даты в средах разработки и производства? - PullRequest
0 голосов
/ 25 марта 2011

Моя Job модель имеет поле job_date, которое определяется в файле миграции следующим образом:

create_table :jobs do |t|
  t.date "job_date", :null => false
  [...]
end

В моей среде разработки (в Windows), когда я делаю:

job = Job.new(:job_date => "17/04/2011")

все работает нормально (т. Е. job_date установлено правильно), а когда я делаю:

job = Job.new(:job_date => "04/17/2011")

job_date устанавливается на nil.

Я думаю,это потому, что база данных (MySQL) ожидает получения даты в формате DD/MM/YYYY.

Проблема заключается в том, что в моей производственной среде происходит прямо противоположное, то есть:

job = Job.new(:job_date => "04/17/2011")

устанавливает 'job_date` должным образом, в то время как:

job = Job.new(:job_date => "17/04/2011")

устанавливает его на nil.

Как я могу устранить это несоответствие?

Есть ли способ настроитьбаза данных для определенного формата даты (например, DD/MM/YYYY)?

1 Ответ

3 голосов
/ 25 марта 2011

Это не проблема базы данных, но я думаю, что это проблема с методом Date.parse в Ruby. Фактически, когда вы вызываете Job.new, он не сохраняется в базе данных, а только создается новый объект модели. Я полагаю, что Rails вызывает метод Date.parse для преобразования строки в объект даты, и это выдает ошибку для формата dd/mm/yyyy на моем компьютере

Date.parse("17/04/2011")
=> ArgumentError: invalid date
    from /usr/lib/ruby/1.8/date.rb:956:in `new_by_frags'
    from /usr/lib/ruby/1.8/date.rb:1000:in `parse'
    from (irb):3

Я думаю, что Rails избегает этой ошибки и дает nil для таких значений

job = Job.new(:job_date => "17/04/2011")
job.job_date
=> nil

job = Job.new(:job_date => "04/17/2011")
job.job_date
=> Sun, 17 Apr 2011

Я полагаю, что результаты вашей производственной среды такие же, как у моей машины и Ruby вашей машины для разработки, Date.parse может работать для другого формата.

Если вам нужно обработать только один формат (либо dd/mm/yyyy, либо mm/dd/yyyy), вы можете использовать Date.strptime для вычисления даты перед передачей в базу данных

job_date = Date.strptime("17/04/2011", "%d/%m/%Y") # or "%m/%d/%Y"
job = Job.new(:job_date => job_date)

Это будет работать как в вашей рабочей среде, так и в среде разработки для одного формата.

...