2013-10-03 64 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