Have to_json return a mongoid as a string

前端 未结 6 957
名媛妹妹
名媛妹妹 2020-12-09 19:00

In my Rails API, I\'d like a Mongo object to return as a JSON string with the Mongo UID as an \"id\" property rather than as an \"_id\" object.

I want my API to retu

相关标签:
6条回答
  • 2020-12-09 19:29
    class Profile
      include Mongoid::Document
      field :name, type: String
      def to_json
        as_json(except: :_id).merge(id: id.to_s).to_json
      end
    end
    
    0 讨论(0)
  • 2020-12-09 19:31

    If you don't want to change default behavior of MongoId, just convert result of as_json.

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

    Also, this convert other BSON::ObjectId like user_id.

    0 讨论(0)
  • 2020-12-09 19:34

    You can monkey patch 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
    

    to take care of the $oid stuff and then Mongoid::Document to convert _id to 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
    

    That will make all of your Mongoid objects behave sensibly.

    0 讨论(0)
  • 2020-12-09 19:46

    You can change data in as_json method, while data is hash:

    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
    

    result:

    {
        "id": "536268a06d2d7019ba000000",
        ...
    }
    
    0 讨论(0)
  • 2020-12-09 19:51

    For guys using Mongoid 4+ use this,

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

    Reference

    0 讨论(0)
  • 2020-12-09 19:51

    Use for example:

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

    this return

    {
        "_id": "54ed1e9896188813b0000001"
    }
    
    0 讨论(0)
提交回复
热议问题