2013-10-03 65 views
3

使用Rails 4.0.0,ruby 2.0p247和mysql2 0.3.13 gem。在我的表在MariaDB的A柱5.5是否activerecord截断时间戳精度?

注:MariaDB的已微秒级精度的支持,因为5.3

`updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, 

精度应该是微秒,所以我在我的模型文件试图

before_save :set_update 

def set_update 
    # also tried 
    # self.updated_at = "2013-10-03 12:35:00.123456 -700" 
    # self.updated_at = Time.now.strftime "%Y-%m-%d %H:%M:%S %6N" 
    # self.updated_at = Time.now.iso8601(6) 
    # doesn't work, still no microseconds 

    self.updated_at = Time.now.to_f 
end 

但在它仍然是数据库

| updated_at     | 
+----------------------------+ 
| 2013-10-03 19:35:00.000000 | 
+----------------------------+ 

为什么rails/activerecord没有存储微秒conds?

+0

我猜这是因为这样的数据库的默认不知疲倦AR被分配值'created_at'和'updated_at'你背后。用一个不同的名字再试一次(并且省略'DEFAULT CURRENT_TIMESTAMP',因为AR不会理解它,并且可能假装它不存在并且可能会把所有东西都搞砸)。 –

+0

@ muistooshort当我硬编码的值看到(self.updated_at =“2013-10-03 12:35:00.123456 -700”),AR确实使用该值,而不是当前时间,但AR截断为(“2013-10- 03 12:35:00“) – Derek

+0

AR可能会忽略您尝试更改'updated_at',因为AR知道'updated_at'是特殊的。再次尝试使用名称为** not **'updated_at'的列,以避免AR出现问题。那么,如果这样做,至少你知道真正的问题是什么,你可以问“如何让我的'updated_at'列的AR手?” –

回答

3

得到它的工作:

将此添加到一个文件中的配置/初始化

class Time 
    DATE_FORMATS = { 
    :db => '%Y-%m-%d %H:%M:%S.%6N' 
    } 
end 

看到conversions.rb获取更多信息。

+0

不应该修改字典/散列吗?例如。 'DATE_FORMATS [:db] ='我的格式'? 如果我正确理解这一点,您将从DATE_FORMATS中扔掉所有其他格式(例如':number') – NobodysNightmare

0

为避免警告,您可以更新常量而不是覆盖它。在config/initializers/database.rb

Time::DATE_FORMATS.merge!({ db: '%Y-%m-%d %H:%M:%S.%6N' }) 

你还需要在你的数据库列设置精度> 1秒。在迁移:

class IncreaseTimestampPrecision < ActiveRecord::Migration 
    def change 
    ActiveRecord::Base.connection.tables.each do |table_name| 
     columns = ActiveRecord::Base.connection.columns(table_name) 

     # set the precision to microseconds for each datetime column on the table 
     columns.select {|col| col.type == :datetime }.each do |column| 
     change_column table_name, column.name, :datetime, limit: 6 
     end 
    end 
    end 
end