Я использую плагин Geokit для расчета расстояния между текущим_пользователем и другими пользователями (геокодирование фактически хранится в модели профиля).
В целях тестирования я создал двух пользователей, одного в Миннеаполисе, штат Миннесота, и одного в Сент-Поле, штат Миннесота. Я использовал гем Geokit для геокодирования пары широта/долгота профилей в сеансе IRB.
Я изменил представление «Указатель», чтобы перечислить имя каждого профиля, местоположение и пару широта/долгота. Эти значения соответствуют значениям в базе данных.
Я изменил представление индекса, чтобы отобразить пару широта/долгота текущего_пользователя. Я аутентифицировался как каждый пользователь, чтобы убедиться, что пара lat/lng для current_user соответствует ожиданиям. Так и было.
Я добавил метод экземпляра в модель Profile с именем ll, чтобы возвращать поля lat/lng как объект LatLng:
def ll
#if lat and lng fields aren't empty
LatLng.new(self.lat,self.lng) if (!self.lat.nil? && !self.lng.nil?)
end
Я изменил запрос в действии индекса ProfileController, чтобы рассчитать расстояние между каждым пользователем и текущим_пользователем:
@profiles = Profile.find(:all,
:conditions => conditions, # set WHERE clause
:order => order_by, # set ORDER BY clause
:origin => current_user.profile.ll, # calculate distance based on current_user's location
:units => :miles # use miles
Наконец, я изменил представление индекса, чтобы отображать расстояние между текущим_пользователем и каждым отдельным пользователем:
<%=h profile.location %> (<%= profile.ll %>) -
<%= profile.distance.to_f.round(1) %> mi
Когда я аутентифицировался как пользователь A (44.9799654,-93.2638361), расчеты расстояния были правильными:
A (44.9799654,-93.2638361) - 0.0 mi B (44.9444101,-93.0932742) - 8.7 m
Однако, когда я аутентифицировался как пользователь B (44.9444101,-93.0932742), расчеты расстояния были неверными:
A (44.9799654,-93.2638361) - 32.8 mi B (44.9444101,-93.0932742) - 41.1 mi
Мне удалось проверить расчеты расстояния между «сырыми» парами широта/долгота:
a = LatLng.new(44.9799654,-93.2638361)
=> #<Geokit::LatLng:0x1034af778 @lat=44.9799654, @lng=-93.2638361>
>> b = LatLng.new(44.9444101,-93.0932742)
=> #<Geokit::LatLng:0x1034aab88 @lat=44.9444101, @lng=-93.0932742>
>> a.distance_to(b)
=> 8.70261379563918
>> b.distance_to(a)
=> 8.70261379563918
Я затрудняюсь объяснить, что происходит. Любые идеи были бы хорошы.