23t*_*tux 6 postgresql timestamp ruby-on-rails ruby-on-rails-3 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")
}
Run Code Online (Sandbox Code Playgroud)
within方法检查范围,Activity.in_week范围返回:
where("activities.starting_at >= ? AND activities.starting_at < ?", start, stop)
Run Code Online (Sandbox Code Playgroud)
在select语句中,我想将starting_at字段截断为day.
我得到日期字段的以下输出:
2011-04-07 18:48:32
2011-04-02 14:07:20
2011-04-02 14:06:49
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不包括时区.当我尝试通过"普通"Rails函数访问我的模型时,它可以工作:
puts Activity.first.starting_at
-> 2011-04-15 06:47:55 +0200
Run Code Online (Sandbox Code Playgroud)
我做错了什么?希望有人可以帮忙!
thx,tux
您的数据库正在以UTC格式存储您的时间戳(应该如此).当ActiveRecord知道它有时间戳时,它会进行时区调整; 所以,当你说这个:
puts Activity.first.starting_at
Run Code Online (Sandbox Code Playgroud)
AR知道这starting_at是一个时间戳,因此它将时间戳ActiveSupport::TimeWithZone实例化为实例,并且该类应用时区调整.但是,当你这样说时:
select("date_trunc('day', activities.starting_at) as date ...
Run Code Online (Sandbox Code Playgroud)
AR不打算解析SQL以确定是否date_trunc会返回时间戳,AR甚至不知道是什么date_trunc意思.AR只会看到一个来自数据库的字符串,它会在没有解释的情况下将它交给您.您可以自由地将该字符串提供给ActiveSupport::TimeWithZone(或者您最喜欢的处理课程的时间):将AR事件告知它本身并且不能自己知道是没有错的.
Rails很聪明,但它并不神奇.
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |