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 также.

Другие вопросы по тегам