Вопрос

Я успешно использую гем gmaps4rails на своей локальной машине MySQL.Однако при развертывании PG на Heroku я получаю следующую ошибку в отношении кода, который использует функцию «near» gmaps4rails для поиска местоположений рядом с выбранным местоположением:

2012-05-21T17:58:40+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::Error: ERROR:  operator does not exist: numeric - character varying
2012-05-21T17:58:40+00:00 app[web.1]:                                                              ^
2012-05-21T17:58:40+00:00 app[web.1]: LINE 1: ...8.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.l...
2012-05-21T17:58:40+00:00 app[web.1]: HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
2012-05-21T17:58:40+00:00 app[web.1]: : SELECT  venues.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.latitude) * PI() / 180 / 2), 2) + COS(30.1926300 * PI() / 180) * COS(venues.latitude * PI() / 180) * POWER(SIN((-85.8356740 - venues.longitude) * PI() / 180 / 2), 2) )) AS distance, CAST(DEGREES(ATAN2( RADIANS(longitude - -85.8356740), RADIANS(latitude - 30.1926300))) + 360 AS decimal) % 360 AS bearing FROM "venues"  WHERE (3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.latitude) * PI() / 180 / 2), 2) + COS(30.1926300 * PI() / 180) * COS(venues.latitude * PI() / 180) * POWER(SIN((-85.8356740 - venues.longitude) * PI() / 180 / 2), 2) )) <= 5) ORDER BY distance LIMIT 5):
2012-05-21T17:58:40+00:00 app[web.1]:   app/controllers/venues_controller.rb:22:in `show'

Подозреваю, что это из-за того, что в этом запросе что-то не поддерживается в postgres, но гем якобы поддерживает postgres.Есть идеи, что происходит?

Это было полезно?

Решение

Похоже, PostgreSQL жалуется на это:

30.1926300 - venues.latitude

и сообщение об ошибке говорит, что не существует оператора, позволяющего вычесть строку из числа.Я предполагаю, что вы создали свой venues.latitude столбец как :string когда это должно быть :float или :decimal.MySQL пытается быть дружелюбным, выполняя множество неявных преобразований типов за вашей спиной, PostgreSQL пытается быть дружелюбным, заставляя вас говорить именно то, что вы имеете в виду, чтобы избежать путаницы.

Вам придется изменить свое latitude столбец к числовому типу.Затем вам следует начать разработку на основе PostgreSQL. Если вы собираетесь развертывать поверх PostgreSQL Heroku, вам также следует сопоставить версию PostgreSQL в ваших средах разработки и развертывания.

AFAIK, вам придется изменить тип вручную с помощью ИЗМЕНИТЬ ТАБЛИЦУ как простой change_column при миграции, вероятно, произойдет ошибка с ошибкой, похожей на

столбец «широта» не может быть приведен к типу двойной точности

Такая миграция:

def up
    connection.execute(%q{
        alter table venues
        alter column latitude
        type float using latitude::float
    })
end

должно помочь PostgreSQL.Вероятно, вам придется исправить venues.longitude также.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top