2012-05-21 42 views
1

我在本地MySQL機器上成功使用了gmaps4rails gem。然而,當我部署到PG在Heroku上,我得到相對於下列代碼錯誤使用了gmaps4rails「附近」功能找到附近的選址地點:Rails -gmaps4rails postgres上的gem

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

看起來像PostgreSQL的抱怨是:

30.1926300 - venues.latitude 

和錯誤消息說,沒有任何操作,使您可以減去一個數字的字符串。我猜你已將venues.latitude列創建爲:string,它應該是:float or :decimal。 MySQL試圖友善地在背後做很多隱式類型轉換,PostgreSQL試圖通過讓你明確地表達你的意思以避免混淆,從而變得友好。

您將不得不將您的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

+0

就是這樣。謝謝! – alpheus

+3

「MySQL試圖友善地在背後做很多隱式類型轉換,PostgreSQL試圖通過讓你明確地表達你的意思來避免混淆,從而變得友好。」 - 哇! +++++++ 1 :) – Salil

+1

@Salil:我不喜歡我的數據庫猜測我正在做什麼或我的意思:破碎的代碼是暫時的,破碎的數據是永遠的。 –