Поиск на основе местоположения в Rails с использованием проблемы геокита
У меня на сайте довольно сложный (или, кажется, так) поиск по геокитам. Короче говоря, у меня есть модель под названием "Кампании", которая принадлежит другой модели под названием "Бизнес". Когда я ищу на сайте, пользователи ищут "Кампании", но я хочу, чтобы все соответствующие модели отображались в результатах, если они ищут это название компании Кампании. Для этого я делаю объединения в поиске.
Кроме того, у меня установлены плагин geokit и gem, чтобы пользователи могли получать результаты этих поисков только в пределах установленного расстояния от исходного местоположения (которое они предоставляют). Тем не менее, я получаю странные результаты, когда я добавляю эту функцию определения местоположения на сайт.
Если я использую следующий поиск (упрощен для краткости, но проверен в консоли):
Campaign.find(:all,
:joins => :business,
:conditions => ['businesses.name LIKE ?', "%Koo Koo Roo%"]
)
Я получаю соответствующий результат, который:
[#<Campaign id: 12, user_id: 4, business_id: 8, created_at: "2011-01-14 16:22:31", updated_at: "2011-01-14 16:25:20", lat: #<BigDecimal:2ad295a9eda8,'0.34154891E2',18(18)>, lng: #<BigDecimal:2ad295a9ed08,'-0.118358834E3',18(18)>>]
Но если я попытаюсь добавить в этот поиск параметры поиска местоположения на основе геокита, например:
Campaign.find(:all,
:joins => :business,
:origin => "90066",
:within => 25,
:conditions => ['businesses.name LIKE ?', "%Koo Koo Roo%"]
)
Я получаю следующий результат:
[#<Campaign id: 8, user_id: 4, business_id: 8, created_at: "2011-01-14 16:25:20", updated_at: "2011-01-14 16:25:20", lat: #<BigDecimal:2ad29933e618,'0.34154891E2',18(18)>, lng: #<BigDecimal:2ad29933e578,'-0.118358834E3',18(18)>>]
Который почти идентичен. Единственное отличие заключается в том, что для второго результата он передает business_id в качестве идентификатора кампании. Я проверил это дважды, и оба раза это одно и то же, идентификатор кампании заменяется на business_id.
Я должен отметить, что это правда, несмотря ни на что: на расстоянии я вхожу.
Что я здесь не так делаю? Я что-то пропустил? Я не могу понять это, мне кажется, все это звучит правдоподобно, но, очевидно, нет! Я не понимаю, как геокит может так облажать результаты.
в моих моделях у меня просто есть:
Business.rb
has_many :campaigns
Campaign.rb
belongs_to :business
Любая помощь будет оценена. Я скучаю по какой-то ассоциации? У меня не включено кэширование геокитов.
Спасибо!
1 ответ
Это потому, что поле "id" перезаписывается хитрым кодом соединения. Когда вы присоединяетесь, у вас есть два поля "id" (одно для бизнеса и одно для кампании). без явной инструкции относительно того, какой это "идентификатор", БД угадывает.
К сожалению, в одной из версий rails есть ошибка, из-за которой в явном виде не указывалось, что основным идентификатором Active Record (в данном случае Campaign.id) был идентификатор, который считается... и БД угадывал неправильный, перезаписывая идентификатор с Business.id.
Вы уже обнаружили простое (но более хакерское) исправление... другое - обновление рельсов.