ruby-on-rails - Rails 不转换时区 (PostgreSQL)

标签 ruby-on-rails ruby-on-rails-3 postgresql timestamp 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

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

谢谢, 晚礼服

最佳答案

您的数据库正在以 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 很聪明,但它并不神奇。

关于ruby-on-rails - Rails 不转换时区 (PostgreSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737504/

相关文章:

postgresql - 对象在 PostgreSQL 数据库中的物理位置?

ruby-on-rails - 使用自定义 url 方案打开 sublime

ruby-on-rails - 在 Rails 简单字符串中解码 JSON 会引发错误

ruby-on-rails - 在 Rails App 中使用 secret 密码

ruby-on-rails - 哈希删除除特定键之外的所有内容

ruby-on-rails-3 - elasticsearch/tyre如何正确返回默认记录集?

json - 在 Postgres 中以嵌套 JSON 形式返回邻接列表

mysql - 使用 `type` 作为数据库列名

ruby-on-rails - 功能测试和嵌套资源

javascript - 动态添加嵌套表单