Есть ли способ обеспечить порядок хеширования гео с использованием mongoid? - PullRequest
1 голос
/ 20 декабря 2011

Есть ли способ обеспечить порядок хеширования гео с использованием mongoid?

В настоящее время я сохраняю его таким образом и выполняю некоторую магию в обратном вызове для обеспечения порядка:

field :location, type: Hash // { :lng => 33.33, :lat => 45 }

set_callback(:save, :before) do |doc|
  if doc.location_changed?
      doc.location = {lng: doc.location[:lng], lat: doc.location[:lat]}
  end
end

Может быть, естькакой-то способ объявить этот хэш как класс.Я думал о Embeded Document, но у него есть _id.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Для этого можно использовать mongoid сериализация настраиваемого поля .

Вот хороший пример: https://github.com/ricodigo/shapado/blob/master/app/models/geo_position.rb

Вот моя собственная реализация, которая хранит местоположение в mongodb как массив:

class LatLng
  include Mongoid::Fields::Serializable

  attr_reader :lat, :lng

  def serialize(value)
    return if value.nil?

    if value.is_a?(self.class)
      [value.lng.to_f, value.lat.to_f]
    elsif value.is_a?(::Hash)
      hash = value.with_indifferent_access
      [hash['lng'].to_f, hash['lat'].to_f]
    end
  end

  def deserialize(value)
    return if value.nil?

    value.is_a?(self.class) ? value : LatLng.new(value[1], value[0])
  end

  def initialize(lat, lng)
    @lat, @lng = lat.to_f, lng.to_f
  end

  def [](arg)
    case arg
      when "lat"
        @lat
      when "lng"
        @lng
    end
  end

  def to_a
    [lng, lat]
  end

  def ==(other)
    other.is_a?(self.class) && other.lat == lat && other.lng == lng
  end
end
0 голосов
/ 21 декабря 2011

Использование BSON::OrderedHash

BSON::OrderedHash[:lng => 33.33, :lat => 45]
...