我设置了索引端点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时间戳而没有时区混乱?
在您的选择查询中:
Select (created_at at time zone 'pst') as created_at from ...
看起来你想要实现的是控制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实例插入到序列化格式中。它可能是您的应用程序配置导致的。
不得不打电话:
Project.where(company_id: @current_company.id).as_json
在渲染JSON之前。
respond_with
本身使用了额外的时区过渡