2012-07-29 46 views
2

這是我第一次嘗試使用PostgreSQL的Rails。我對通常看到的有關存儲絕對時間的列的代碼中缺少timestamp with timezone用法感到困惑。一個主要的例子是devise,它存儲列的日期時間列,它轉換爲PostgreSQL中的timestamp with out timezoneRails數據庫特定的數據類型

我認爲這是一個不好的做法,因爲timestamp with out timezone可能意味着任何時區。如果您正在從另一個應用程序訪問數據庫,那麼您應該有不知道哪些時區的時間戳引用,而不看Rails。它只是成爲一個分散的混亂。

有沒有辦法爲我創造了PostgreSQL中的ActiveRecord遷移/模式的timestamp with time zone?會與當前的Rails框架代碼產生不兼容問題?

我明白ActiveRecord的嘗試是數據庫無關的,但是這僅僅是一個忌諱我不能忽視。

回答

2

我建議考慮看看這個答案(很能說明問題):Ignoring timezones altogether in Rails and PostgreSQL


UPDATE

據ActiveRecord的文檔,上面的鏈接,和我自己的測試 - 我有得出的結論是,在架構遷移的默認的ActiveRecord datetimetimestamp列類型不能進行修改,以強制的PostgreSQL使用timestamp with time zone

PostgreSQL文檔:

注:SQL標準要求,只需編寫時間戳 相當於沒有時間戳時區,和PostgreSQL榮譽是 行爲。 (7.3版之前的版本將其作爲時間戳,時區爲 )。timestamptz被接受爲時間戳的縮寫, 時區;這是一個PostgreSQL擴展。

http://www.postgresql.org/docs/9.1/static/datatype-datetime.html

+3

這沒有幫助,謝謝。 – 2012-07-30 00:39:24

+1

您必須假設所有時間都存儲爲UTC,這是跨多個時區的良好做法。在任何第三方應用程序或查詢中,只需從UTC轉換到您希望的時區,並且您擁有正確的時間。 PostgreSQL中的所有數據都應該是UTC。如果它沒有被存儲爲真正的UTC,那麼這可能是一個問題。 – 2012-07-30 01:19:02

+0

是的,我正在那樣做。 – 2012-07-30 01:21:14

0

我們可以使用this寶石覆蓋配置和使用適配器特定的數據類型。