Поле 'distance' удаляется при использовании Geokit с acts_as_mappable: through - PullRequest
1 голос
/ 15 мая 2011

Мы знаем, что поле расстояния удаляется при использовании Geokit Gem в Rails с act_as_mappable: through класс модели. Интересно, есть ли способ обойти это, чтобы вернуть поле расстояния. Я попытался последовать примеру с патчами для обезьян: http://www.sobyteme.com/news/2010/05/13/computers/2010/06/25/geokit-acts_as_mappable-through-with-distance-attribute/ но у меня это не сработало.

1 Ответ

1 голос
/ 24 мая 2011

Что ж, предложение Стива на его сайте было верным, мне не хватало вызова sort_by_distance_from после выполнения поиска.Так что заслуга ему в этом ответе.

Я на Rails v3.0.7.Вот мой код:

class Office < ActiveRecord::Base
    has_many :users
    acts_as_mappable :default_units => :miles, 
                     :default_formula => :sphere, 
                     :lat_column_name => :latitude,
                     :lng_column_name => :longitude
end

class User < ActiveRecord::Base
    belongs_to  :office
    acts_as_mappable :through => :office
end

users_controller.rb:

# Monkey patching to include the 'distance' attribute
module Geokit
  module Mappable
    def to_lat_lng
      return self if instance_of?(Geokit::LatLng) || instance_of?(Geokit::GeoLoc)
      return LatLng.new(self.office.send(self.office.class.lat_column_name),
        self.office.send(self.office.class.lng_column_name)) if self.class.respond_to?(:acts_as_mappable)
      nil
    end
  end 
end

class UsersController < ApplicationController

  def location
    @lat = params[:lat].to_f
    @long = params[:long].to_f
    @origin = [@lat, @long]
    @users = User.find(:all, 
         :origin => @origin,
         :conditions => "distance < 3")

    # We have to add this to get the 'distance' field
    @users.sort_by_distance_from(@origin)

    respond_to do |format|
      format.html
      format.xml  { render :xml => @users.to_xml(:methods => :distance)}
      format.json  { render :json => @users.to_json(:methods => :distance)}
    end
  end 
...
end
...