Ruby model output id as object oid

坚强是说给别人听的谎言 提交于 2019-12-18 12:31:08

问题


My ruby model, like so:

class User
  include Mongoid::Document
  field :first_name, type: String
  field :birthdate, type: Date

  validates :first_name, :birthdate, :presence => true

end

outputs an object like so:

{
_id: {
$oid: "522884c6c4b4ae5c76000001"
},
birthdate: null,
first_name: null,
}

My backbone project has no idea how to handle _id.$oid.

I found this article and code:

https://github.com/rails-api/active_model_serializers/pull/355/files

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

I have no idea where to put this, and how to invoke it on the model output, so I tried inside:

/config/initializers/secret_token.rb

I'm new to Ruby and Rails and have no idea how to proceed, so any help is greatly appreciated


回答1:


What you should do is place this in the initializer folder, create a file like this:

/config/initializers/mongoid.rb

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



回答2:


Iterating on Kirk's answer:

In Mongoid 4 the Moped’s BSON implementation has been removed in favor of the MongoDB bson gem, so the correct version for Mongoid 4 users is:

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

    def as_json(*args)
      to_s.as_json
    end
  end
end



回答3:


Aurthur's answer worked for everything except rabl. If you are using rabl the attributes :id will throw an exception. The following code will be compatible with rabl.

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

      def as_json(*args)
        to_s.as_json
      end
    end
  end
end

For more information, see the github issue https://github.com/nesquena/rabl/issues/337




回答4:


For guys using Mongoid 4+ use this,

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

Reference




回答5:


Here is a better answer

require "bson"

class Jbuilder < JbuilderProxy

  def _extract_method_values(object, *attributes)
    attributes.each do |key|
      value = object.public_send(key)

      if value.is_a? ::BSON::ObjectId
        value = value.to_s
      end

      _set_value key, value
    end
  end
end


来源:https://stackoverflow.com/questions/18646223/ruby-model-output-id-as-object-oid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!