2015-11-02 41 views
2

因此,Rails 4.2开始支持MySQL的小数秒。但是it requires a migration of column change from datetime to datetime(6)。目前我们不想这样做,只是想忽略小数秒,就像我们以前一直在做的那样。在MySQL上禁用Rails 4.2小数秒支持

Rails不够聪明,看不到我的日期时间精度为0,并相应地更改查询,所以我们的许多规范都崩溃了。例如,我们断言“选择在最近一小时内创建的所有Foo”,但值保持无毫秒,但select语句仍然使用毫秒,因此很多记录不会被选中。

的Rails 4.2之前:

where("foo_at >= ?", 1.day.ago) =>foo_at >= '2015-11-02 04:48:18'

在Rails 4.2:

where("foo_at >= ?", 1.day.ago) =>foo_at >= '2015-11-02 04:48:18.934162'

是否有一个全局设置强制AR查询以去掉小数/毫秒,它以前一直在做?

回答

3

还有就是要关闭它没有正式的方式,但是你可以重写的行为可用,

module ActiveRecord 
    module ConnectionAdapters 
    class Mysql2Adapter < AbstractMysqlAdapter 
     def quoted_date(value) 
     super 
     end 
    end 
    end 
end 

这是在https://github.com/rails/rails/blob/v4.2.5/activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb#L77-L83

而且你可以在滑轨5删除它,在导轨5 https://github.com/rails/rails/commit/bb9d20cf3434e20ac6f275e3ad29be42ebec207f提交应根据时间列的精度格式的时间字符串

1

从阅读Rails 4.2.x分支源代码,我没有看到任何改变这一点的选项。

我看到一个merged PR,它将查看数据库列的精度,并根据该精度构建sql datetime字符串。这应该消除我的问题,即由于持久数据和查询之间的精度不匹配而导致我的规范崩溃。然而,这是不是在4.2.x版合并,所以它可能只会在Rails的5