2010-08-12 2 views
4

Я использую geokit камень и плагин с рельсами 3. Кажется, есть известная проблема с ними, которые можно увидеть здесь http://github.com/andre/geokit-rails/issues#issue/15Geokit и рельсы 3

Теперь я пытался следовать решению, предложенное на дно. Я вложил это определение функции в конец файла чуть выше act_as_mapable и сразу после его первого вызова, но ничего не происходило каждый раз.

Любая идея, что еще можно сделать?

Благодаря

ответ

1

Для тех, кто по-прежнему возникают проблемы с geokit, я перешел к использованию MongoDB ... который имеет встроенный поиск расстояния п все ...

0

Эй Amit, Не уверен, что если вы сортируется на это, но пока я вам скажу, что я сделал на всякий случай.

я раздвоенный источник geokit рельсов Андрэ, а затем клонировать его на месте и добавляет код из this gist на линии 34 из lib/geokit-rails/acts-as-mappable.rb, только после того, как линии, которая читает module ClassMethods # :nodoc:.

Затем я внес эти изменения обратно в разветвленное репо на github и использовал свою вилку для установки источника в качестве плагина для моего приложения rails 3. Казалось, что это сработало сразу, но убедитесь, что вы добавили линию acts_as_mappable к любой модели, на которую вы хотите выполнить вычисления расстояния, и убедитесь, что у вас есть два столбца на этом db с именем :lat и :lng.

+0

эй! да, что сработало, но почему-то плагин не работает с рельсами 3 nemore ... поэтому я просто сделал свой собственный плагин;) – Amit

7

У меня возникли аналогичные проблемы с обновлением моего приложения до рельсов 3. Я по-прежнему использую Geokit для геокодирования, но области Active Record для запросов на основе базы данных на основе расстояния. Это довольно удобно, и вы все равно получаете все Active Active 3. Вот пример из моей модели пользователя:

scope :near, lambda{ |*args| 
        origin = *args.first[:origin] 
        if (origin).is_a?(Array) 
        origin_lat, origin_lng = origin 
        else 
        origin_lat, origin_lng = origin.lat, origin.lng 
        end 
        origin_lat, origin_lng = deg2rad(origin_lat), deg2rad(origin_lng) 
        within = *args.first[:within] 
        { 
        :conditions => %(
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) <= #{within} 
        ), 
        :select => %(users.*, 
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) AS distance 
        ) 
        } 
       } 

Вот сообщение в блоге с немного более подробно на эту тему: http://stcorbett.com/code/distance-queries-with-rails-3-without-geokit/

+0

Полезное сообщение в блоге stcorbett. Получение расстояния назад от db является удобным, а цельные области - приятными. Я бы предупредил, что новое поле появится в модели пользователя (в данном случае), и вы можете указать это поле, чтобы указать, что он не является постоянным атрибутом пользователя, а расстоянием от другого пользователя. –

+0

Ahh, интересный пункт. Я мог видеть, как именовать новый атрибут, на основе которого пользователь рассчитывает расстояние до. например: «distance_to_user _ # {origin.id}». Это дает вам дополнительный обруч для перехода, когда вы хотите использовать данные о расстоянии. Хорошая вещь. – stcorbett

4

jlecour's port to rails 3 должен решить любые проблемы, возникшие в прошлом году.

Убедитесь, что вы используете mysql или postgres, если выполняете вычисления расстояния.

3

После устранения проблемы установки geokit-rails3 gem on Rails 3.1 я перешел на geocoder gem. Он также имеет расчет расстояния (обязательно не забудьте s в @ your_model.nearby * s * (5)). Существует также Railscast.

Смежные вопросы