在我的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
答案 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
答案 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
。