Поиск на основе местоположения в 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.

Вы уже обнаружили простое (но более хакерское) исправление... другое - обновление рельсов.

Другие вопросы по тегам