Rails在created_at和updated_at中插入无效的日期时间

时间:2012-06-13 23:08:14

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

我在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 :我自己解决了(请参阅下面的答案),但是如果你知道它是否是一个bug,你会很感激,如果是这样的话,那么这个bug是哪个包(ActiveRecord) ?)。

1 个答案:

答案 0 :(得分:0)

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

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

现在,当我在另一列中保存一个具有Time或DateTime的对象,并将其设置为Time / DateTime对象时,它设置正确,所以我倾向于说这是一个bug。 / p>