Skip to content

Problem when try to return a Polygon from database #46

@mrmarcondes

Description

@mrmarcondes

the model

class Delivery
  class Zone
    include Mongoid::Document
    include Mongoid::Timestamps
    include Mongoid::Geospatial

    field :area, type: Polygon, sphere: true
  end
end

creating an area

area = Mongoid::Geospatial::Polygon.new([[-46.74579620361328, -23.526297058421182],[-46.723995208740234, -23.548172777916854],[-46.707258224487305,-23.529917032960597],[-46.725196838378906,-23.517167984845393],[-46.74579620361328,-23.526297058421182]])

json = {'type': 'Polygon', coordinates: [area]}

Delivery::Zone.create(area: json)

On MongoDB

> db.delivery_zones.find().pretty()
{
  "_id" : ObjectId("57684889ae61d11b5ec5c992"),
  "area" : {
    "type" : "Polygon",
    "coordinates" : [
      [
        [
          -46.62915229797363,
          -23.575944975344676
        ],
        [
          -46.630589962005615,
          -23.58227747294
        ],
        [
          -46.62475347518921,
          -23.582965769489153
        ],
        [
          -46.62292957305908,
          -23.577046301216768
        ],
        [
          -46.62915229797363,
          -23.575944975344676
        ]
      ]
    ]
  }
}

Executing on rails c

Delivery::Zone.last.area

TypeError: no implicit conversion of BSON::Document into Integer
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/mongoid-geospatial-5.0.0/lib/mongoid/geospatial/geometry_field.rb:86:in `initialize'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/mongoid-geospatial-5.0.0/lib/mongoid/geospatial/geometry_field.rb:86:in `new'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/mongoid-geospatial-5.0.0/lib/mongoid/geospatial/geometry_field.rb:86:in `demongoize'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/mongoid-5.1.3/lib/mongoid/fields/standard.rb:10:in `demongoize'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/mongoid-5.1.3/lib/mongoid/fields.rb:418:in `block (2 levels) in create_field_getter'
    from (irb):3
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/commands/console.rb:110:in `start'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/commands/console.rb:9:in `start'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
    from /Users/marco/Documents/prj/zipster/ecommerce/src/bin/rails:9:in `<top (required)>'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/commands/rails.rb:6:in `call'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/command_wrapper.rb:38:in `call'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:191:in `block in serve'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:161:in `fork'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:161:in `serve'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:131:in `block in run'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:125:in `loop'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:125:in `run'
    from /Users/marco/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application/boot.rb:19:in `<top (required)>'
    from /Users/marco/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Users/marco/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'

I changed the line 86 of geometry_field.rb from:

        def demongoize(obj)
          obj && new(obj)
        end

to

        def demongoize(obj)
          obj
        end

And apparently worked.
Question: Why we have the '&& new(obj)'?
Thank you,
Marco.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions