【问题标题】:Rails inserting invalid datetimes in created_at and updated_atRails 在 created_at 和 updated_at 中插入无效的日期时间
【发布时间】:2012-06-13 23:08:14
【问题描述】:

我在 Ruby 1.8.7 上使用 Rails 3.2.2 和 mysql2 0.3.11(针对 mysql 14.14 服务器),有时 created_atupdated_at 值将是无效的 DateTime,并导致我的应用程序使用消息"Invalid date: 2022-03-00 00:00:00" 引发异常。

我没有明确地创建、设置、读取或对 created_atupdated_at 列进行任何操作。

通过mysql 客户端检查表,在大多数情况下,每列中的值都是“0000-00-00 00:00:00”,在 Rails 中以nil 结尾。但是,有几行显示了诸如“2022-03-00 00:00:00”之类的值(它们都是不同的,但据我所知,都是 2022 年的)。

有趣的是,我什至无法从 Rails 运行 .destroy(),因为它无法创建对象。

哪些可能会为这些列设置无效日期?

编辑:所有表格都会发生这种情况。这是我的 schema.rb,以及其中一张表的所有迁移:https://gist.github.com/2930655

Edit2:我自己解决了它(请参阅下面的答案),但如果你能权衡一下它是否是一个错误,如果是,那么这个错误与哪个包(ActiveRecord ?)。

【问题讨论】:

  • 您对该表的迁移是什么以及它在 schema.rb 中的内容是什么?

标签: mysql ruby-on-rails ruby-on-rails-3.2 mysql2 ruby-1.8


【解决方案1】:

事实证明,这是因为我重载了 Time#to_s,导致在 SQL 中发送无效值(它为 DateTimes 发送 HH:MM:SS)。

MySQL 和 SQLite 都无法以这种格式解析 DateTimes,并导致垃圾值,但是,根据 Ruby,SQLite 的值永远不会“无效”,所以我在开发过程中从未注意到这一点。

现在,当我在另一列中保存具有时间或日期时间的对象并将其设置为时间/日期时间对象时,它设置正确,因此我倾向于说这是一个错误。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多