2016-07-25 56 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

是的。 '全球'默认时间格式。 –

相关问题