Сериализация JSON, кроме объектов embeds_one в Mongoid?

Учитывая этот объект документа mongoid «Отчет», который embeds_one объект местоположения:

{
  comment: "",
  location: {
    address: "391 Little Bourke St, Melbourne VIC 3000, Australia",
    geocode: {
      ll: "-37.813787,144.961227",
    }
  },
  _id: "4d84af7f52f3d40539000021",
}

Как исключить геокодирующую часть хэша местоположения?

Например, легко исключить поле комментария, выполнив это в модели отчета:

def to_json(options={})
  options[:except] ||= :comment
  super(options)
end

Как выглядит код, кроме «геокода», который является частью местоположения?


person BenB    schedule 20.03.2011    source источник
comment
Вы пытались сделать то же самое для класса Location, например. :кроме =› :геокод?   -  person Roman    schedule 15.04.2011


Ответы (1)


Работает на меня:


require 'rubygems'
require 'mongoid'

Mongoid::Config.settings = {
  "host" => "127.0.0.1",
  "database" => "testing"
}

class Report
  include Mongoid::Document
  embeds_one :location

  field :comment
end

class Location
  include Mongoid::Document
  field :address
  field :geocode, :type => Hash

  embedded_in :report
end

report = Report.new(:comment=>'comment', :location => {:address=>'elm street', :geocode => {:ll=>'-31'}})
puts report.to_json(:include=>:location, :except => :geocode)

дает: {"_id":"4dab2655b4e4cf2fa6000001","comment":"comment","location":{"_id":"4dab2655b4e4cf2fa6000002","address":"улица вязов"}}

и если вы хотите, чтобы Location всегда пропускал геокод, вам следует переопределить serializable_hash внутри класса Location:


  def serializable_hash(options = nil)
    options ||= {}
    options[:except] = :geocode
    super(options).tap do |attrs|
      serialize_relations(attrs, options) if options[:include]
    end
  end
person Roman    schedule 17.04.2011