1

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

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. Любая идея, что происходит?

ответ

4

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

30.1926300 - venues.latitude 

и сообщение об ошибке говорит, что не существует ни один оператор, который позволяет вычесть строку из ряда. Я предполагаю, что вы создали свой столбец venues.latitude как :string, когда он должен быть :float or :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.

+0

Это было. Благодаря! – alpheus

+3

«MySQL пытается быть дружелюбным, делая много неявных преобразований типа за вашей спиной, PostgreSQL пытается быть дружелюбным, заставляя вас сказать, что именно вы хотите избежать путаницы». - Вау! +++++++ 1 :) – Salil

+1

@Salil: Мне не нравятся мои базы данных, которые догадываются о том, что я делаю, или о том, что я имею в виду: сломанный код временный, сломанные данные навсегда. –