0

我已经发送了基于两个表的 Rails AREL 查询结果的 json 响应。响应包括两个时间戳列:updated_at 和 updated_at_table_2。我重写 ActiveSupport::TimeWithZone.as_json 方法来获取 JSON 所需的日期时间格式。相同的方法显示在

http://stackoverflow.com/questions/2937740/rails-dates-with-json

我当前的 JSON 响应是: { "updated_at":"10/26/2012 22:04:07 -0400", "updated_at_table_2":"2012-10-27 02:04:07.463015" }

我希望他们是一样的。我依靠下面的 Rails 代码来生成 json。

render :json => { :customer_order  =>  @customer_order  }

其中@custoemr_order 来自:

CustomerOrder.select(%Q[
      updated_at,
      c.updated_at as updated_at_table_2
    ] ).
    joins( %{ as co inner join customers as c on (co.customer_id = c.id)

问题:如何告诉 Rails 3 以与 updated_at_table_2 和 updated_at 列相同的方式处理 as_json?

任何建议/指针也很棒。

注意:我发现这篇文章询问了相同的根本问题(尽管不是关于 json),但没有很好的解决方案。:

http://stackoverflow.com/questions/12067173/rails-postgres-not-returning-timezone-info-on-column-from-joined-table
4

1 回答 1

1

如果你看看你的查询给你什么,你会确切地看到你哪里出错了:

 > o = CustomerOrder.select(%Q[ ... ]).joins(...)
 > puts o.updated_at.class
=> ActiveSupport::TimeWithZone
 > puts o.updated_at_table_2.class
=> String

ActiveRecord 无法知道updated_at_table_2应该是什么类型的东西,因此它将其保留为字符串,并且您的to_json猴子补丁不会应用于字符串。

如果你想继续使用你的to_json猴子补丁(我认为这是一个坏主意),那么你需要手动转换updated_at_table_2为一个ActiveSupport::TimeWithZone类似这样的东西:

x = ActiveSupport::TimeWithZone.new(
    Time.parse(o.updated_at_table_2),
    Time.zone
)
# x is now an ActiveSupport::TimeWithZone

或者,您可以加载关联的对象并调用updated_at它。

不过,我会放弃整个方法:让服务器仅在 UTC 中工作,以 ISO-8601 格式向客户端发送时间戳,并让客户端处理应用本地时区。

于 2012-10-27T05:30:37.787 回答