我设置了一个索引端点API。此API控制器不是从应用程序控制器继承的。
def index
@projects = Project.all
respond_with @projects
end
查询它将返回:
[{"id":7,“名称”:“某物”,“位置”:“美国”,"user_id":54,"created_at":{"^o":"ActiveSupport::TimeWithZone","utc"://don't need
{"^t":1513746428.835358000},"time":null,"time_zone"://don't need
问题是,它会在每个project
中返回大量的时区信息,这会降低应用程序的运行速度。
如何才能在没有时区混乱的情况下,仅返回PG数据库中显示的created_at时间戳?
发布于 2018-03-04 20:16:36
不得不打电话给:
Project.where(company_id: @current_company.id).as_json
在呈现JSON之前。
respond_with
本身使用了额外的时区转换
发布于 2018-02-28 00:59:26
在select查询中:
Select (created_at at time zone 'pst') as created_at from ...
发布于 2018-02-28 02:02:52
看起来你想要实现的是你的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实例插入到您的序列化格式中。这可能是你的应用程序的配置问题导致的。
https://stackoverflow.com/questions/49020332
复制