1

ローカル MySQL マシンで gmaps4rails gem を正常に使用できました。ただし、Heroku で PG にデプロイすると、gmaps4rails の "near" 関数を使用して選択した場所の近くの場所を検索するコードに関して、次のエラーが発生します。

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 のこのクエリでサポートされていないことが原因であると思われますが、gem は postgres をサポートしていると思われます。何が起こっているのか分かりますか?

4

1 に答える 1

4

PostgreSQLがこれについて不平を言っているようです:

30.1926300 - venues.latitude

エラーメッセージには、数値から文字列を減算できる演算子がないことが示されています。またはである必要があるときに、venues.latitude列を として作成したと思います。MySQL は、ユーザーの背後で多くの暗黙的な型変換を行うことでフレンドリーになろうとします。PostgreSQL は、混乱を避けるために、ユーザーが意図することを正確に言わせることでフレンドリーになろうとします。:string:float:decimal

latitude列を数値型に変更する必要があります。次に、Heroku の PostgreSQL の上にデプロイする場合は、PostgreSQL の上で開発を開始する必要があります。開発環境とデプロイ環境の PostgreSQL バージョンも一致させる必要があります。

私の知る限り、 ALTER TABLEを使用してタイプを手動で変更する必要があります。単純なchange_column移行はおそらく次のようなエラーで失敗するためです

列「緯度」は倍精度型にキャストできません

このような移行:

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

PostgreSQLのトリックを行う必要があります。おそらくあなたも修正する必要がありますvenues.longitude

于 2012-05-21T18:16:07.507 に答える