代码之家  ›  专栏  ›  技术社区  ›  Tony

我可以告诉ActiveRecord在访问时不要将“日期时间”数据转换为对象吗?

  •  3
  • Tony  · 技术社区  · 16 年前

    我有一些代码只访问日期时间字段,因此ActiveRecord会在我读取它时自动将其转换为时间对象:

    @some_appointment.some_time
    

    问题是有时“some-time”datetime列的数据不正确。0209-12-20”,而不是“2009-12-20”。这会导致Ruby在访问时抛出一个“年份太大,无法封送”错误,而我似乎无法捕获它,因为该错误不是一个例外。鉴于我的数据库中有一些无效数据,我想通过读取日期时间字符串并使用time.parse自己创建时间对象,以便在无法分析时间时捕获异常。我怎样才能做到这一点?有更好的方法吗?

    3 回复  |  直到 16 年前
        1
  •  3
  •   rfunduk    16 年前

    你可以试试 attribute_for_inspect ,如:

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

    您还可以考虑编写一个独立的脚本,该脚本不使用ActiveRecord来检查数据库中的数据,以规范化数据或其他内容。这可能比将坏数据的特殊情况编码到应用程序中要快。

        2
  •  3
  •   scottd    16 年前

    我没有测试过这个是否有效,但你试过了吗 attributes_before_type_cast ?它在Rails运行类型转换之前返回数据,但我不确定Rails在加载对象时是否会尝试进行转换。

    例子:

    @some_appointment.attributes_before_type_cast['some_time']
    
        3
  •  1
  •   Ben Marini    16 年前

    在您的模型中,您可以像这样重写默认的访问器:

    def some_time
      read_attribute(:some_time)
      rescue
        # Try to parse this guy
        self.some_time_before_type_cast
    end