3

shape と呼ばれるポリゴン列を持つ postgres テーブルがあります。ポイントが内部にあるかどうかを判断するために実行します

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

これはすべて問題なく、Ruby 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 以上のテストはすべて機能しますが、この 1 つだけで問題ありません。また、コードとコンソールで機能します。テスト環境はすべて適切にセットアップされています。

私の質問: - 比較対象を機能させるにはどうすればよいですか? - そして、なぜテストでのみ失敗するのでしょうか?

4

2 に答える 2

5

デフォルトでは、activerecord は schema.rb を使用して、テスト データベースを開発データベースと同期させます。Schema.rb はデータベースに依存しません (移行と同じ構成を使用します) が、データベースが持つ可能性のあるすべての機能、特に多くの余分なものを追加する Postgres のようなものをすべてサポートする傾向があるわけではありません。

代わりに、データベース独自のツールを使用して、schema.rb の代わりに Rails が失う .sql ファイルを生成するようにconfig.active_record.schema_format設定できます。:sql別のデータベースに対してテストを実行する機能は失われますが、postgres 固有の拡張機能を使用している場合は、とにかくそのシナリオになります。

もう 1 つの可能性は、アクティブ レコードのスキーマ ダンパーを強化して、多角形の列を理解することです。Foreigner gem は、たとえば schema.rb に外部キーのサポートを追加します。

于 2012-10-04T07:02:20.430 に答える
1

このエラーは、shape列がvarcharとして定義されていることを示しているようです。ポリゴンであることを確認してください。

\d areas
于 2012-10-04T04:14:06.773 に答える