在MySQL上禁用Rails 4.2小数秒支持

时间:2015-11-02 05:38:17

标签: mysql ruby-on-rails ruby-on-rails-4

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

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查询去除之前的分数/毫秒?

2 个答案:

答案 0 :(得分: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

你可以在Rails 5中删除它,rails 5 https://github.com/rails/rails/commit/bb9d20cf3434e20ac6f275e3ad29be42ebec207f中的提交应该根据时间列的精度格式化时间字符串

答案 1 :(得分:1)

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

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