Rails — драгоценный камень gmaps4rails в postgres
-
12-12-2019 - |
Вопрос
Я успешно использую гем 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
также.