ruby-on-railsmongoid

Have to_json return a mongoid as a string


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 return the following JSON:

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

Instead of:

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

My model code is:

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

Solution

  • 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.