2016-07-25 53 views
0

因此,我正在使用Rails(4.2.6)和PostgreSQL,我有一個包含類型爲Time的字段end_time的表,我遇到的問題是下一個:Rails返回UTC而不是僅帶有Postgresql的文本

SELECT end_time FROM group_periods; 

會導致:

| end_time | 
| 08:00:00 | 

正如你可以看到它不僅帶來包含在該領域(08:00:00)的文本,但如果我嘗試做它在Rails中,將在end_time一個帶時間對象,即使我把它轉換成文字

GroupPeriod.select("end_time") 

會導致:

=> #<ActiveRecord::Relation [#<GroupPeriod id:nil, end_time: "2000-01-01 08:00:00">]> 

後我嘗試進入end_time對象帶來一個Ruby Time對象。

我也都試過了,導致相同的:

GroupPeriod.select("end_time::text") 
GroupPeriod.select("to_char(end_time, 'HH24:MI') end_time") 

我怎麼能拿領域end_time作爲一個字符串,所以每當我訪問現場我得到了相同的結果,Postgres的?

編輯

有沒有機會做的strftime並獲得TE字符串格式每個記錄上,由於我有成千上萬的記錄,那就是我已經嘗試投的字段作爲文本,以便軌道的主要原因會返回一個字符串而不是Time對象。

回答

2

你可以重寫屬性訪問器end_time型號和類型轉換

喜歡的東西

class GroupPeriod < ActiveRecord::Base 
    ... 

    def end_time 
    self.end_time_before_type_cast 
    end 

    ... 
end 

文檔之前返回屬性

+0

我相信這是正確的答案。 –

+0

這可以做到這一點,非常感謝你! –

+0

嘿,如果我試圖訪問它,就好像模型是一個哈希,它不會觸發該方法,任何選項? –

0

Rail的ActiveRecord將屬性值轉換爲Ruby對象。因此,當您在模型上使用ActiveRecord的API進行查詢時,它會將模型對象返回給對應的Ruby對象。

如果您想從對象的time屬性中獲取時間字符串,可以按時使用strftime方法。

GroupPeriod.select("end_time").first.end_time.strftime("%H:%M:%S") 

文檔:

+0

我現在的問題是,不僅是一條記錄,是數千,除此之外,我也試圖將該字段作爲文本投入,以便導軌將它作爲字符串返回,而我沒有成功 –

0

您可以設置全局默認時間格式:

在初始化:

Time::DATE_FORMATS[:default] = '%H:%M:%S' 

或在您的config/locales/en.yml

en: 
    time: 
    formats: 
     default: '%H:%M:%S' 
+0

這將改變整個應用程序的格式,不是嗎? – aBadAssCowboy

+0

是的。 '全球'默認時間格式。 –

相關問題