我在使用Rails 3.0.4和PostgreSQL 9.0时遇到了与时区相关的问题。我正在使用自定义作用域,在其中添加一些条件、连接等。
问题是,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字段截断到天。对于日期字段,我得到以下输出:
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
我做错了什么?希望有人可以帮忙! 谢谢, tux
activities.starting_at
在数据库中是什么类型?如果在psql
中选择activities
的starting_at
,会发生什么? - mu is too shortactivities.starting_at
是一个timestamp without a timezone
(存储在 UTC 中)。select starting_at from activities
返回的是2011-04-15 04:47:34
,同样没有时区。但是 Rails 不应该自动将时间转换为特定的时区吗?通过我在问题中提供的示例puts Activity.first.starting_at -> 2011-04-15 06:47:55 +0200
,它可以工作。 - 23tuxString
。但它应该是ActiveSupport::TimeWithZone
。我阅读了postgresql的文档,并且date_trunc('day', activities.starting_at)
应该返回一个timestamp
。为什么Rails不会转换它呢? - 23tux