Rails API返回太多时间格式

问题描述 投票:0回答:3

我设置了索引端点API。此API控制器不从Application Controller继承。

def index
    @projects = Project.all
    respond_with @projects
end

查询它返回:

[{“id”:7,“name”:“Something”,“location”:“United States”,“user_id”:54,“created_at”:{“^ o”:“ActiveSupport :: TimeWithZone”,“utc “://don't need {”^ t“:1513746428.835358000},”time“:null,”time_zone“://don't need

问题是它会在每个project中返回大量的时区信息,从而减慢应用程序的速度。

如何在PG数据库中看到的UTC中只返回created_at时间戳而没有时区混乱?

ruby-on-rails
3个回答
1
投票

在您的选择查询中:

Select (created_at at time zone 'pst') as created_at from ...

1
投票

看起来你想要实现的是控制json的格式化。

如果是这种情况,我想你想创建一个json视图。我没有使用响应者gem,所以我可能没有看到一些细微差别,但通常你会创建一个文件来指定你想要返回的内容。

在index.json.jbuilder中:

json.array! @projects, :id, :name, :location, :user_id, :created_at

我的项目配置方式,created_at显示如下:"created_at":"2017-12-17T10:09:12.141Z"。但是,根据ActiveSupport类的序列化行为,您可能仍会遇到问题。如果是这样,您可以通过调用方法进一步自定义输出:

json.array! @projects do |project|
  json.extract! project, :id, :name, :location, :user_id
  json.created_at project.created_at.utc
  # Or perhaps something like:
  #   json.created_at project.created_at.in_time_zone.as_json
end

如果您的用例使jbuilder不合适,您可以使用不同的序列化程序。

ActiveModel :: Serializer是一种常见的选择;您可以控制序列化的属性,还有控制这些属性序列化方式的机制。

class ProjectSerializer < ActiveModel::Serializer
  attributes :id, :name, :location :created_at
  belongs_to :user
end

但是有一个重要的警告:我不能完全重现你的问题。在我创建的一个全新的极简主义的rails api项目中,来自render json: @projects, status: :ok的返回json(没有jbuilder,没有自定义)为我返回“created_at”:“2018-02-28T02:31:10.603Z”,所以我认为你需要了解如何将ActiveSupport TimeWithZone实例插入到序列化格式中。它可能是您的应用程序配置导致的。


0
投票

不得不打电话:

Project.where(company_id: @current_company.id).as_json

在渲染JSON之前。

respond_with本身使用了额外的时区过渡

© www.soinside.com 2019 - 2024. All rights reserved.