mysql Rails-gmaps4rails gem on postgres



ruby-on-rails ruby-on-rails-3 (1)

Я успешно использую gmaps4rails gem на моей локальной машине 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. Любая идея, что происходит?


Похоже, 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 .





gmaps4rails