2012-10-04 33 views
3

我有一個帶有稱爲shape的多邊形列的postgres表。爲了確定一個點是否裏面我跑在測試環境中未啓用Postgresql擴展

select * from areas where shape @> point '(1,1)'; 

這是所有罰款和在我on Rails應用程序的紅寶石工作,但它在我的RSpec測試失敗。當我看我的日誌我覺得這是錯誤的源

PGError: ERROR: operator does not exist: character varying @> point 
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

使用DB工作,僅這一項撈出其他所有50次以上的測試。再次,它在代碼和控制檯中工作。測試環境都已正確設置。

我的問題: - 如何讓比較對象工作? - 爲什麼它只會在測試中失敗?

+0

您是否意外地在您的測試環境中使用了不同類型的數據庫(例如mysql)? –

+0

@DavidGrayson:'PGError'表示PostgreSQL,所以我不認爲這是問題所在。 –

+0

>你有沒有在你的測試數據庫中加載所有必要的PostgreSQL擴展? 我沒有做任何具體的事情。它是一種簡單的幾何類型,不需要我知道的任何擴展。 –

回答

1

該錯誤似乎表明shape列被定義爲varchar。檢查以確定它是一個多邊形。

\d areas 
+0

在我的開發環境中它是一個多邊形,再次驗證。當我運行rake db:schema:dump並查看schema.rb時,它再次被歸類爲普通字符串。 –

4

默認情況下,activerecord使用schema.rb使測試數據庫與開發數據庫保持同步。 Schema.rb是獨立於數據庫的(它使用與遷移相同的構造),但反面是它不傾向於支持數據庫可能具有的所有花裏胡哨的功能,特別是像Postgres那樣增加了大量額外功能的功能。

您可以將config.active_record.schema_format設置爲:sql,而不是使用數據庫自​​己的工具生成.sql文件,導致rails將丟失而不是schema.rb。您將失去運行鍼對不同數據庫的測試的能力,但是如果您使用postgres特定的擴展名,那麼無論如何您都是在這種情況下。

另一種可能性是增強活動記錄的模式翻轉器以理解多邊形列。外國人gem增加了對schema.rb的外鍵支持,例如

+0

我發現這個解決方法。運行rake db:test:clone_structure。用「rspec」而不是「rake spec」運行測試,因爲它總是會重新生成結構,反正慢得多。所以這有點奏效。 –