有to_json返回一个mongoid作为字符串

时间:2014-05-06 21:58:56

标签: ruby-on-rails mongoid

在我的Rails API中,我希望Mongo对象作为JSON字符串返回,其中Mongo UID作为“id”属性而不是“_id”对象。

我希望我的API返回以下JSON:

{
    "id": "536268a06d2d7019ba000000",
    "created_at": null,
}

而不是:

{
    "_id": {
        "$oid": "536268a06d2d7019ba000000"
    },
    "created_at": null,
}

我的型号代码是:

class Profile
  include Mongoid::Document
  field :name, type: String

  def to_json(options={})
    #what to do here?
    # options[:except] ||= :_id  #%w(_id)
    super(options)
  end
end

5 个答案:

答案 0 :(得分:12)

你可以修补Moped::BSON::ObjectId

module Moped
  module BSON
    class ObjectId   
      def to_json(*)
        to_s.to_json
      end
      def as_json(*)
        to_s.as_json
      end
    end
  end
end

负责$oid内容,然后Mongoid::Document_id转换为id

module Mongoid
  module Document
    def serializable_hash(options = nil)
      h = super(options)
      h['id'] = h.delete('_id') if(h.has_key?('_id'))
      h
    end
  end
end

这将使你的所有Mongoid对象都表现得很明智。

答案 1 :(得分:7)

对于使用Mongoid 4+的人来说,使用它,

module BSON
  class ObjectId
    alias :to_json :to_s
    alias :as_json :to_s
  end
end

Reference

答案 2 :(得分:5)

您可以使用as_json方法更改数据,而数据是哈希值:

class Profile
  include Mongoid::Document
  field :name, type: String

   def as_json(*args)
    res = super
    res["id"] = res.delete("_id").to_s
    res
  end
end

p = Profile.new
p.to_json

结果:

{
    "id": "536268a06d2d7019ba000000",
    ...
}

答案 3 :(得分:0)

使用例如:

user = collection.find_one(...)
user['_id'] = user['_id'].to_s
user.to_json

此回归

{
    "_id": "54ed1e9896188813b0000001"
}

答案 4 :(得分:0)

如果您不想更改MongoId的默认行为,只需转换as_json的结果即可。

profile.as_json.map{|k,v| [k, v.is_a?(BSON::ObjectId) ? v.to_s : v]}.to_h

此外,这会转换其他BSON::ObjectId,例如user_id