【问题标题】:Can I tell activerecord to not convert "datetime" data to objects when I access?我可以告诉 activerecord 在我访问时不要将“日期时间”数据转换为对象吗?
【发布时间】:2010-01-05 00:13:17
【问题描述】:

我有一些代码只是访问一个日期时间字段,所以当我阅读它时,activerecord 会自动将它转换为一个时间对象:

@some_appointment.some_time

问题是有时“some_time”日期时间列的数据不正确。 “0209-12-20”而不是“2009-12-20”。这会导致 Ruby 仅通过访问就抛出“年份太大而无法编组”错误,我似乎无法捕捉到它,因为该错误不是异常。鉴于我的数据库中有一些无效数据,我想尝试通过读取日期时间字符串并使用 Time.parse 自己制作时间对象,以便在无法解析时间时捕获异常。我怎样才能做到这一点?有没有更好的办法?

【问题讨论】:

  • 您这样做是为了摆脱不良数据的一个实例吗?如果是这样,看起来确实需要做很多工作,当您可以直接与数据库交互来纠正这个问题时。

标签: ruby-on-rails datetime activerecord


【解决方案1】:

你可以试试attribute_for_inspect,如:

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

您也可以考虑编写一个不使用 activerecord 的独立脚本来检查数据库中的数据以对其进行规范化或其他操作。这可能比将不良数据的特殊情况编码到您的应用中更快。

【讨论】:

    【解决方案2】:

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

    例子:

    @some_appointment.attributes_before_type_cast['some_time']
    

    【讨论】:

    • 或更好:@some_appointment.some_time_before_type_cast
    【解决方案3】:

    您可以在模型中像这样覆盖默认访问器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      相关资源
      最近更新 更多