Rails不转换时区(PostgreSQL)

我有时区和postgresql数据库的问题(Rails 3.0.4,PostgreSQL 9.0)。 我正在使用自定义范围,其中我附加了一些条件,做了连接等.pp。

问题是,Rails不会将时间转换为我的本地时区。 以下是范围的代码:

scope :with_activities_within_range_in_week, lambda{ |latMin, lngMin, latMax, lngMax, date| select("date_trunc('day', activities.starting_at) as date, count(activities.id) as value ") \ .within(latMin, lngMin, latMax, lngMax) \ .joins(:activities) \ .merge(Activity.in_week(date)) \ .group("date") \ .order("date") } 

within方法检查范围,Activity.in_week范围返回:

 where("activities.starting_at >= ? AND activities.starting_at < ?", start, stop) 

在select语句中,我想将starting_at字段截断为day。

我得到日期字段的以下输出:

 2011-04-07 18:48:32 2011-04-02 14:07:20 2011-04-02 14:06:49 

不幸的是,它不包括时区。 当我尝试通过“普通”Rails函数访问我的模型时,它可以工作:

 puts Activity.first.starting_at -> 2011-04-15 06:47:55 +0200 

我做错了什么? 希望有人可以帮忙!

thx,tux

您的数据库正在以UTC格式存储您的时间戳(应该如此)。 当ActiveRecord知道它有时间戳时,它会进行时区调整; 所以,当你说这个:

 puts Activity.first.starting_at 

AR知道starting_at是一个时间戳,因此它将时间戳实例化为ActiveSupport::TimeWithZone实例,并且该类应用时区调整。 但是,当你这样说时:

 select("date_trunc('day', activities.starting_at) as date ... 

AR不会解析SQL以确定date_trunc将返回时间戳,AR甚至不知道date_trunc含义。 AR只会看到一个从数据库中出来的字符串,它会在没有解释的情况下交给你。 您可以自由地将该字符串提供给ActiveSupport::TimeWithZone (或者您最喜欢的时间处理类):将AR事件告知它本身并且无法自己知道是没有错的。

Rails很聪明,但它并不神奇。