Вопрос по ruby-on-rails-3, mysql, ruby-on-rails, postgresql – Rails - гем gmaps4rails на postgres

1

Я успешно использую гем gmaps4rails на своей локальной машине MySQL. Однако при развертывании в PG на Heroku я получаю следующую ошибку в отношении кода, который использует gmaps4rails & quot; near & quot; Функция поиска мест рядом с выбранным местом:

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   ответ
4

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

30.1926300 - venues.latitude

и сообщение об ошибке говорит, что нет оператора, который позволяет вычесть строку из числа. Я предполагаю, что вы создали свойvenues.latitude колонка как:string когда это должно быть:float or :decimal, MySQL старается быть дружелюбным, делая много неявных преобразований типов за вашей спиной, PostgreSQL старается быть дружелюбным, заставляя вас говорить именно то, что вы имеете в виду, чтобы избежать путаницы.

Вам придется изменить свойlatitude столбец числового типа. Затем вы должны начать разработку поверх PostgreSQL, если вы собираетесь развертывать поверх PostgreSQL Heroku, вы также должны соответствовать версии PostgreSQL в своих средах разработки и развертывания.

AFAIK, вам придется изменить тип вручную с помощьюALTER TABLE как простойchange_column в миграции, вероятно, произойдет сбой с ошибкой, аналогичной

column "latitude" cannot be cast to type double precision

Миграция, как это:

def up
    connection.execute(%q{
        alter table venues
        alter column latitude
        type float using latitude::float
    })
end

должен сделать трюк для PostgreSQL. Предположительно, вам придется исправитьvenues.longitude также.

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

Похожие вопросы