Могу ли я сказать activerecord не преобразовывать данные «datetime» в объекты при доступе? - PullRequest
3 голосов
/ 05 января 2010

У меня есть код, который просто обращается к полю даты и времени, поэтому activerecord автоматически преобразует его в объект Time, когда я его читаю:

@some_appointment.some_time

Проблема в том, что иногда столбец datetime иногда имеет неверные данные. «0209-12-20» вместо «2009-12-20». Это приводит к тому, что Ruby выдает ошибку «слишком большой для маршала» только из-за доступа, и я не могу ее уловить, поскольку ошибка не является исключением. Учитывая, что в моей базе данных есть недопустимые данные, я хочу попытаться создать объект времени самостоятельно, прочитав строку datetime и используя Time.parse, чтобы я мог перехватить исключение, если время не может быть проанализировано. Как я могу сделать это? Есть ли способ лучше?

Ответы [ 3 ]

3 голосов
/ 05 января 2010

Я не проверял это, чтобы увидеть, работает ли он, но вы пробовали attributes_before_type_cast? Он возвращает данные до того, как Rails выполнит преобразование типов, но я не уверен, попытается ли Rails выполнить преобразование при загрузке объектов в любом случае.

Пример:

@some_appointment.attributes_before_type_cast['some_time']
3 голосов
/ 05 января 2010

Вы можете попробовать attribute_for_inspect, например:

SomeModel.find(:first).attribute_for_inspect 'some_time'
#=> ""2009-02-23 23:15:24""

Вы могли бы также рассмотреть возможность написания автономного скрипта, который не использует activerecord, чтобы просмотреть ваши данные в базе данных, чтобы нормализовать их или что-то еще. Это, вероятно, будет быстрее, чем кодирование особого случая неверных данных в вашем приложении.

1 голос
/ 05 января 2010

Вы можете переопределить средства доступа по умолчанию, как это в вашей модели:

def some_time
  read_attribute(:some_time)
  rescue
    # Try to parse this guy
    self.some_time_before_type_cast
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...