2012-02-10 41 views
11

Rails':timestamp列類型謊言;它實際上只是:datetime的別名。使ActiveRecord/Rails使用實際的MySQL TIMESTAMP列

我正在使用mysql,我想用實際的unix-timestamp TIMESTAMP列。

a)有沒有一種很好的方法來設置它,除了使用SQL來創建列外? b)請問ActiveRecord能否正確處理它(例如,在必要時轉換爲Time,接受unix時間戳Integer作爲輸入等)??????????????????????????????????我應該期望處理什麼問題,以及在哪裏?

爲什麼:

  1. 速度。這是一個非常活躍的表,它彙集了已使用unix時間戳的外部數據源。轉換爲日期時間(或者甚至首先轉換爲數據庫字符串,這通過2 gsub s)佔用了大部分導入時間。否則我可能只是做一個便宜的電話。

  2. 時區。我不想要他們。我希望它存儲時區 - agnostically;處理時區是一種痛苦,除了在個人用戶顯示之前的最後階段,與我的需求完全無關。數據本身並不需要知道它記錄的時區。

  3. 大小。這是一張大桌子。 TIMESTAMP is half the size of DATETIME.

是的,我仍然會做代碼updated_at計算,而不是MySQL的。這部分不是瓶頸。

爲什麼你的 '爲什麼不' 是錯誤的(先發制人,以示我不要求noobish原因:-P):

  1. 「但是,TIMESTAMP自動更新」:That's only true by default, and can be easily switched off.
  2. 我實際上不使用Rails,只是ActiveRecord。
  3. 是的,這是基於actual profiling data;我不是早期優化。 ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote(在Quoting#quoted_date [如果通過Time]或Mysql2Adapter#quote_string [如果preconverting to_s(:db)])實際上是我的刮板中CPU消耗最多的部分。我想擺脫它。
+0

它爲什麼重要,如果你正在使用Rails(#2)? (我使用Rails,但考慮使用時間戳來節省空間。) – 2013-11-21 18:50:28

回答

0

我很漂亮,但我會給它一個鏡頭。如果您要添加自己的自定義列或覆蓋默認列?在你的邏輯

def mysql_timestamp 
    Time.now.strftime("%Y-%m-%d %H:%M:%S") 
end 

不知道關於B)

t.add_column :mysql_timestamp, 'timestamp' 

,然後在其他地方:您可以使用自定義數據類型的字符串像這樣。只有一種方法來找出!

+0

'timestamp'列類型不是TIMESTAMP,它是DATETIME。 – Sai 2012-02-28 17:06:42

+1

只有當它是一個符號。如果你使用一個字符串,它可以是任何你想要的,至少,根據@tadman在這篇文章http://stackoverflow.com/questions/4100209/ruby-rails-active-record-db-migration-to -mysql-timestamp-type#4100341雖然我還沒有嘗試過。 – 2012-02-29 19:44:20

+0

@protolif不像描述的那樣工作。 – aTei 2014-04-30 18:36:05

7

此作品(剛剛添加空格字符輸入的定義,所以:時間戳不覆蓋它):

 t.add_column :sometable, :created_at, 'timestamp '