вторник, 10 марта 2015 г.

ArgumentError: comparison of String with Date failed

Что не так со следующим кодом?
# здесь custom_lot_attributes - колонка типа 'hstore' в таблице lots
start_date = lot.custom_lot_attributes['start_date']
if start_date && start_date < Date.today
  # ...
end

При выполнии этого участка кода возникает ошибка:
ArgumentError: comparison of String with Date failed
Это связано с тем, что мы пытаемся сравнить дату со строкой. Из hstore мы получаем строку, поэтому в переменной start_date содержится дата в виде строки, к примеру "2015-03-10".
Для устранения ошибки нужно преобразовать строку в дату. Для этого в Rails есть метод to_date.
Теперь ошибки возникать не будет:

start_date = lot.custom_lot_attributes['start_date'].to_date
if start_date && start_date < Date.today
  # ...
end

А сможете ли вы найти ошибку в этом коде?
start_date = lot.custom_lot_attributes['start_date'].to_date
if start_date && start_date < Date.today
  lot.custom_lot_attributes['start_date'] = Date.today
  lot.custom_lot_attributes['end_date'] = 
    lot.custom_lot_attributes['end_date'] +
    (Date.today - lot.custom_lot_attributes['start_date'])
end

Данный код будет вызывать ошибку:
TypeError: can't convert Rational into String
Причина аналогична предыдущей, мы забыли преобразовать строковое значение, полученное из hstore, в дату.
Вот как должно быть:
start_date = lot.custom_lot_attributes['start_date'].to_date
if start_date && start_date < Date.today
  lot.custom_lot_attributes['start_date'] = Date.today
  lot.custom_lot_attributes['end_date'] = 
    lot.custom_lot_attributes['end_date'].to_date +
    (Date.today - lot.custom_lot_attributes['start_date'].to_date)
end


Комментариев нет:

Отправить комментарий