Поиск на основе местоположения в Rails с использованием проблемы геокита - PullRequest
2 голосов
/ 16 января 2011

У меня довольно сложный (или, кажется, так) поиск по геокитам на моем сайте. Короче говоря, у меня есть модель под названием «Кампании», которая принадлежит другой модели под названием «Бизнес». Когда я ищу на сайте, пользователи ищут «Кампании», но я хочу, чтобы все соответствующие модели отображались в результатах, если они ищут это название компании Кампании. Для этого я делаю объединения в поиске.

У меня дополнительно установлены плагин 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 Ответ

0 голосов
/ 22 марта 2011

Это потому, что поле "id" перезаписывается хитрым кодом соединения.Когда вы присоединяетесь, у вас есть два поля «id» (одно для бизнеса и одно для кампании).без явной инструкции относительно того, какой идентификатор является «идентификатором», БД угадывает.

К сожалению, в одной из версий rails есть ошибка, из-за которой она явно не указала, что основной идентификатор Active Record (в этомcase Campaign.id) был идентификатором, который учитывается ... и БД угадывал неправильный, перезаписывая идентификатор с помощью Business.id.

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

...