2015-09-25 22 views
1

當我運行在軌道下面的命令:在rails或sql中克服「ActiveRecord :: StatementInvalid:PG :: AmbiguousFunction」的方法。 (st_intersects不是唯一的函數名)

CensusBlockGroup.where{st_interects(:the_geom, buffer)} 

運行在SQL命令:

SELECT "census_block_groups".* FROM "census_block_groups" WHERE (st_intersects("census_block_groups"."proj_shape_3361", '002000000300000d2...')) 

我得到這個錯誤:

ActiveRecord::StatementInvalid: PG::AmbiguousFunction: 
ERROR: function st_intersects(geometry, unknown) is not unique 
LINE 1: ...lock_groups".* FROM "census_block_groups" WHERE (st_interse... 
HINT: Could not choose a best candidate function. You might need to add explicit type casts. 

我不知道如何添加明確的類型轉換,老實說,不清楚明白甚至意味着什麼。我看到上面的st_intersects函數正在傳入第二個參數'unknown'。也許我可以「投」這個並讓它起作用......?

我認爲這個問題可能是由於其「函數重載」功能導致postgresql中有多個函數定義st_intersects。我不是第一個在這個系統上安裝postgresql/postgis的開發者,我是一個承包商,所以我擔心我們可能會重複我們的工作。

我在Ubuntu「12.04 LTS」VPS上使用postgresql & postgis運行rails服務器。

我很確定我可以重新安裝postgis,但這會消滅我的承包商的代碼,它執行一些非常複雜的東西與pg_routing,我不想觸摸。如果我必須啓動一個新的linode並運行代碼,但它看起來有點浪費,甚至更像是一種失敗。

如果我無法通過消除歧義(這通常適用於Mac和Linux發行版),我無法正確解決問題,我認爲另一種解決方案是標記postgresql忽略歧義,並選擇第一個st_intersects它遇到的功能。

其他說明:

  • 幾何工廠,我使用rgeo是 'GEOS'
  • 幾何形狀直角,沒有地理

類似的問題(仍在離開我抓我的頭像ORM開發商一樣癱瘓):

回答

1

我從來沒有使用過Rails,但的確,在PostgreSQL中函數ST_Intersects有一個覆蓋,這意味着根據參數的類型,應該調用一個不同的函數。

在這種情況下,這些是替代:

boolean ST_Intersects(geometry geomA , geometry geomB);

boolean ST_Intersects(geography geogA , geography geogB);

基於由你顯示的生成的查詢時,PostgreSQL可能是有一個很難識別其功能來運行,添加顯式轉換(一種方式來指定某個值的類型)會告訴哪個函數應該被調用。

要做到這一點在PostgreSQL的簡單使用 「::」 的值之後,如:

幾何:

SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING (0 0, 0 2)'::geometry); 

所以一定要確保兩值:the_geombuffer幾何類型相匹配,並你應該沒問題。也許ActiveRecord有一種顯式更改類型的方法?或者你可以直接將查詢寫入PostgreSQL?

(來源:http://postgis.net/docs/ST_Intersects.html

+0

能得到這一次我學會了如何做一對夫婦的事情工作。 1.)我瞭解到我可以創建AR類作用域,然後運行#to_sql來獲取要修改的SQL代碼。2)生成適當的SQL字符串以使用方法(或我的例子中的lambda表達式)執行。在我的情況下,我使用#as_text方法將二進制代碼切換到WKT 3.附加「EPSG = 4326;」到WKT文本,以便postgis考慮到正確的SRID。 4.)通過'ActiveRecord :: Base.connection.select_rows(sql)運行那個原始數據庫' –

+0

我對我的代碼庫中的這個非常複雜的孤立區域沒有超級興奮,但作爲一個rails GIS程序員,我真的很高興並不是所有這些被混淆的解決方案所困擾,看到它的工作原理。 –

+0

很高興你解決了boulder_ruby!在運行RAW SQL語句時注意SQL注入。 –

相關問題