Rails to_json响应将datetime转换为unixtimestamp

时间:2014-03-11 01:50:17

标签: ruby-on-rails json datetime unix-timestamp

我使用rails创建了一个REST API,并使用.to_json将API输出转换为json响应。例如。 @ response.to_json

响应中的对象包含created_at和updated_at字段,均为Datetime

在JSON响应中,这两个字段都转换为字符串,解析比unixtimestamp更昂贵。

有没有一种简单的方法可以将created_at和updated_at字段转换为unixtimestamp而无需遍历@response中的整个对象列表?

[更新] danielM的解决方案是有效的,如果它是一个简单的.to_json。但是,如果我有.to_json(:include =>:object2),as_json将导致响应不包括object2。对此有何建议?

1 个答案:

答案 0 :(得分:4)

在响应模型上定义as_json方法。每当您将响应模型的实例作为JSON返回到REST API时,都会运行。

def as_json(options={})
    {
        :id => self.id,
        :created_at => self.created_at.to_time.to_i,
        :updated_at => self.updated_at.to_time.to_i
    }
end

您还可以显式调用as_json方法以获取哈希并在其他地方使用它。

hash = @response.as_json

Unix时间戳参考:Ruby/Rails: converting a Date to a UNIX timestamp

编辑:as_json方法也适用于关系。只需将密钥添加到函数返回的哈希值即可。这将运行相关模型的as_json方法。

def as_json(options={})
    {
        :id => self.id,
        :created_at => self.created_at.to_time.to_i,
        :updated_at => self.updated_at.to_time.to_i,
        :object2 => self.object2,
        :posts => self.posts
    }
end

此外,您可以将参数传递给方法以控制哈希的构建方式。

def as_json(options={})
    json = {
        :id => self.id,
        :created_at => self.created_at.to_time.to_i,
        :updated_at => self.updated_at.to_time.to_i,
        :object2 => self.object2
    }

    if options[:posts] == true
        json[:posts] = self.posts
    end
    json
end

hash = @response.as_json({:posts => true})