當我運行在軌道下面的命令:在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.)我瞭解到我可以創建AR類作用域,然後運行#to_sql來獲取要修改的SQL代碼。2)生成適當的SQL字符串以使用方法(或我的例子中的lambda表達式)執行。在我的情況下,我使用#as_text方法將二進制代碼切換到WKT 3.附加「EPSG = 4326;」到WKT文本,以便postgis考慮到正確的SRID。 4.)通過'ActiveRecord :: Base.connection.select_rows(sql)運行那個原始數據庫' –
我對我的代碼庫中的這個非常複雜的孤立區域沒有超級興奮,但作爲一個rails GIS程序員,我真的很高興並不是所有這些被混淆的解決方案所困擾,看到它的工作原理。 –
很高興你解決了boulder_ruby!在運行RAW SQL語句時注意SQL注入。 –