Rails - гем gmaps4rails на postgres
Я успешно использую гем gmaps4rails на своей локальной машине MySQL. Однако при развертывании в PG на Heroku я получаю следующую ошибку в отношении кода, который использует функцию "рядом" 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. Есть идеи, что происходит?
1 ответ
Похоже, PostgreSQL жалуется на это:
30.1926300 - venues.latitude
и сообщение об ошибке говорит, что нет оператора, который позволяет вычесть строку из числа. Я предполагаю, что вы создали свой venues.latitude
колонка как :string
когда это должно быть :float
или же:decimal
, MySQL старается быть дружелюбным, делая много неявных преобразований типов за вашей спиной, PostgreSQL старается быть дружелюбным, заставляя вас точно сказать, что вы имеете в виду, чтобы избежать путаницы.
Вы должны будете изменить свой latitude
столбец числового типа. Затем вы должны начать разработку поверх PostgreSQL, если вы собираетесь развертывать поверх PostgreSQL от Heroku, вы также должны соответствовать версии PostgreSQL в своих средах разработки и развертывания.
AFAIK, вам придется изменить тип вручную с помощью ALTER TABLE как простой change_column
в миграции, вероятно, произойдет сбой с ошибкой, аналогичной
столбец "широта" не может быть приведен к типу двойной точности
Миграция, как это:
def up
connection.execute(%q{
alter table venues
alter column latitude
type float using latitude::float
})
end
должен сделать трюк для PostgreSQL. Предположительно, вам придется исправить venues.longitude
также.