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
对象视为 DateTime
s,这解释了您看到的奇怪插入查询。 Rails 4 中的行为似乎有所改变,因此升级可能会解决问题。
在任何情况下,日期值似乎都会被 MySQL 截断,因此会发出警告,但存储的时间对我来说似乎是正确的。
最后,这次你需要一个时区吗?
【讨论】:
当时我不需要时区。是的,我知道 Rails 正在这样做。它也在选择查询中执行此操作。只是想知道是否有办法以某种方式将其关闭。升级 Rails 是一件有风险的事情,所以我可能会做一个原生 mysql 查询并直接运行它。以上是关于Ruby活动记录在mysql中插入日期时间而不是时间的主要内容,如果未能解决你的问题,请参考以下文章