Плагин Geocoder Rails - Проблема ближнего поиска с ActiveRecord - PullRequest
0 голосов
/ 16 июля 2010

Это затягивает мне нервы!

Сценарий:

Я использую плагин геокодера: http://github.com/alexreisner/geocoder/
У меня есть две модели: адрес и пункт
широта и долгота в адресе и Item belongs_to :address

Теперь, когда я пытаюсь выполнить поиск рядом:
Item.near(Person.first.address.coordinates, 20)
на элементе происходит сбой со следующим SQL:
Неизвестный столбец «широта» в «списке полей»:

SELECT *, 3956 * 2 * ASIN(SQRT(POWER(SIN((51.3883 - latitude) * PI() / 180 / 2), 2) + COS(51.3883 * PI()/180) * COS(latitude * PI() / 180) * POWER(SIN((6.65326 - longitude) * PI() / 180 / 2), 2) )) AS distance FROM `items` WHERE ((latitude BETWEEN 51.0984449275362 AND 51.6781550724638 AND longitude BETWEEN 6.188777824785 AND 7.117742175215) AND (`items`.`accepted` IS NULL AND `items`.`taken_by` IS NULL)) ORDER BY distance ASC

Не смотрите на странные математические вещи в запросе,
проблема заключается в предложении FROM и WHERE, потому что
атрибуты широты и долготы являются частью таблицы адресов,
поэтому простое дополнение к Query решит проблему:

... FROM items, addresses WHERE ...
... null)) AND items.address_id = addresses.id ORDER BY ...

Я просто хочу добавить таблицу в поле ОТ и условие: (
Я попытался использовать несколько named_scopes, используя: include и: joins, но ни один из них не сработал!
Кто-нибудь знает решение этой проблемы? Как я могу вставить это в объект ActiveRecord в области?

1 Ответ

1 голос
/ 16 июля 2010

Итак, у Предмета есть адрес (а), и именно там на самом деле существуют долгота и широта, верно?Вот где я думаю, что запрос идет не так для вас.Вы можете попробовать добавить: joins =>: address ... но мне больше нравится следующее:

Так как вся математика происходит в базе данных, я думаю, вы могли бы сделать:

Address.near(Person.first.address.coordinates, 20)

и затем получите элементы, которым принадлежат адреса, может быть, даже: include =>: item или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...