Rails API返回太多时间格式

时间:2018-02-28 00:53:07

标签: ruby-on-rails

我设置了索引端点API。此API控制器不从应用程序控制器继承。

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时间戳,而不会出现时区混乱?

3 个答案:

答案 0 :(得分:1)

在您的选择查询中:

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

答案 1 :(得分: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实例插入到序列化格式中。它可能是您的应用程序配置导致的。

答案 2 :(得分:0)

不得不打电话:

img = imread(file);              % returns img: (1024, 1024) with values [0, 1]
[img, cmap] = imread(file);      % returns img: (1024, 1024) with values [0, 1], cmap (256x3)

在渲染JSON之前。

Project.where(company_id: @current_company.id).as_json 本身使用了额外的时区转换