Ruby活动记录在mysql中插入日期时间而不是时间

Posted

技术标签:

【中文标题】Ruby活动记录在mysql中插入日期时间而不是时间【英文标题】:Ruby active record inserting datetime instead of time in mysql 【发布时间】:2016-07-21 00:07:44 【问题描述】:

Rails Active Record 保存在插入查询中使用 datetime,尽管 mysql 中的数据类型是 time 并且在保存之前在模型中设置了时间

mysql 架构:

rtime time DEFAULT NULL

ActiveRecord 模型:Abc

abc = Abc.new 'rtime'=> '18:23 PM'
abc.save!

活动记录生成的对应mysql查询:

insert into abces (rtime) values('2000-01-01 18:23:00');

后面mysql只存储时间,切掉日期,还会产生警告。

+-----------------------+
| rtime                 |
+-----------------------+
| 18:23:00              |
+-----------------------+`

为什么在mysql插入的时候日期会附加时间? Rails 版本:3.2.16

【问题讨论】:

【参考方案1】:

在 Rails 3+ 中分配时间时,ActiveRecord 似乎经常回退到 DateTime 对象:https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/attribute_assignment.rb#L130

这里有一些关于转换方法的文档:http://apidock.com/rails/Time/time_with_datetime_fallback/class。此外,在同一文件的第 180 行有一条评论暗示了这一点:# we instantiate Time object and convert it back to a date thus using Time's logic in handling invalid dates

因此,Rails 3 似乎经常将 Time 对象视为 DateTimes,这解释了您看到的奇怪插入查询。 Rails 4 中的行为似乎有所改变,因此升级可能会解决问题。

在任何情况下,日期值似乎都会被 MySQL 截断,因此会发出警告,但存储的时间对我来说似乎是正确的。

最后,这次你需要一个时区吗?

【讨论】:

当时我不需要时区。是的,我知道 Rails 正在这样做。它也在选择查询中执行此操作。只是想知道是否有办法以某种方式将其关闭。升级 Rails 是一件有风险的事情,所以我可能会做一个原生 mysql 查询并直接运行它。

以上是关于Ruby活动记录在mysql中插入日期时间而不是时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用活动记录查询sql以获取指定时间之间的日期

mysql按照时间条件查询 忽略是时分秒查询

用于 mysql 的 Subsonic 3.0.0.4 活动记录模板不返回最后插入的 id

BigQuery:如何在重复记录中插入新值?

mysql记录根据日期字段倒序输出

在时区支持处于活动状态时收到一个天真的日期时间