Как сохранить данные из массива json в базу данных MongoDB? - PullRequest
2 голосов
/ 19 октября 2011

Как сохранить координаты маркера, полученные в качестве параметра json, и построить его в поля lat и lng с правильными значениями? Я пытался сделать это разными способами, но это дало всем неудачу. Ниже тех, которые ближе всего на мой взгляд, хорошо.

#controller:
def create
  @user = User.new()
  received_json = ["{\"lat\":52.38521483550798,\"lng\":16.866459809082016}", "{\"lat\":52.40458894240522,\"lng\":16.856503449218735}", "{\"lat\":52.42605757375466,\"lng\":16.86989303662108}"]
  # objArray=JSON.parse(received_json.to_json)
  objArray=ActiveSupport::JSON.decode(received_json.to_json)

  #example 1
  objArray.each do |obj|
    @user.markers.build(obj)
  end
  # NoMethodError (undefined method `each_pair' for "{\"lat\":52.38521483550798,\"lng\":16.866459809082016}":String):

  #example 2
  objArray.each do |obj, value|
    @user.markers.build(obj=>value)
  end
  # BSON::InvalidKeyName ({"lat":52.38521483550798,"lng":16.866459809082016} - key must not contain '.'):

  #example 3
  objArray.each do |obj|
    @user.markers.build(lat:obj)
  end
  # This approach save data but in one field lat in user markers array
  # Data Saved: {"_id":"4e9eac161e7bf208280002fb","markers":[{"_id":"4e9eac161e7bf208280002fc","lat":"{\"lat\":52.38521483550798,\"lng\":16.866459809082016}"},{"_id":"4e9eac161e7bf208280002fd","lat":"{\"lat\":52.40458894240522,\"lng\":16.856503449218735}"},{"_id":"4e9eac161e7bf208280002fe","lat":"{\"lat\":52.42605757375466,\"lng\":16.86989303662108}"}]}
end

#model
class User
  include Mongoid::Document
  field :name, :type => String
  embeds_many :markers, :inverse_of => :user
end

class Marker
  include Mongoid::Document
  field :lat, :type => Float
  field :lng, :type => Float
  embedded_in :user, :inverse_of => :marker
end

1 Ответ

3 голосов
/ 19 октября 2011

Попробуйте следующий код

def create 
  @user = User.new
  received_json = ["{\"lat\":52.38521483550798,\"lng\":16.866459809082016}", "{\"lat\":52.40458894240522,\"lng\":16.856503449218735}", "{\"lat\":52.42605757375466,\"lng\":16.86989303662108}"]
  markers = received_json.collect { |attributes| ActiveSupport::JSON.decode(attributes) } 
  markers.each do |marker| 
    @user.markers.build(marker)
  end 
  @user.save
end 
...