2011-01-20 18 views
4

ローカル私はSQLiteで開発していますが、私のプロダクションホストではPostgreSQLを実行しています。ローカルではすべてが正常ですが、運用ホストでは問題ありません。PGError:ERROR:演算子が存在しません:ブール値~~ *未知数

私は、私が望む任意の組み合わせでデータベースのすべてのデータを評価できる検索フォームの種類を作りました。これは、私がブール値フィールドや日付フィールドを使用しない限り正常に動作しているようです。なぜ、とにかくことをだ

unless params[:analysis][:sporty].blank? 
    tmp_conditions_customer << ["(sporty ILIKE ?)", "%#{params[:analysis][:sporty]}%"] 
end 

これは

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

に評価:PostgreSQLは

ので、ここでいくつかのサンプルコードがあります...非常に私のコードを好きに思えないのですか?なぜ '%%'?

デプロイメントをテストするために、私はHerokuをExceptionalプラグインと併用しています。このプラグインは私に次のヒント与える:例外

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

おかげで、それは一体何を意味するのでしょうか? : - D SQLクエリの型キャスト?どうしたらうまくいくの?

私の移行では、データベースのフィールドは次のようになります。

t.boolean :sporty 

そして私は、私はすでに述べたように、私はこのコードを

<%= f.label :sporty %><br /> 
<%= f.select :sporty, options_for_select({ "Ja" => true, "Nein" => false }), { :include_blank => '-----'} %> 

を使用していてこのデータを作成してい形で、 SQLiteは私の友人であり、問​​題を引き起こすPostgreSQLのはるかに厳しい評価のようです。

ご協力いただきありがとうございます。

答えて

4

直接回答が一番下にあります。 。 。 SQLで

This evaluates to

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

Why’s that anyway? Why the '%%'?

、 '%' はワイルドカードです。しかし、あなたの問題は、あなたがWHERE句を構築していることにあるようです。このような句は、おそらく返す(またはカウント)します

Aすべての行:

WHERE (sport ILIKE '%%') 

Type casts for SQL queries? How’s that gonna work?

標準SQLには、CAST()関数を持っています。スケルトンの構文は、したがって、たとえば、あなたが文字列を変更するには、日付データ型、または

CAST ('32' AS INTEGER) 

にタイムスタンプを変更するには '32' を

CAST (<any timestamp> AS DATE) 

を書くことができます

CAST (expression AS type) 

です整数32に変換する。

In my migration the database field looks like this:

t.boolean :sporty 

列 "スポーティ" がブール値である場合、これはあなたの本当の問題です。あなたが行ったブール値に対して文字列比較を使用しようとすると、あなたが見たエラーメッセージが表示されます:

(あなたが行った:WHERE(スポーティなILIKE '%%'))あなたの答えのための
SELECT COUNT(*) FROM "customers" WHERE sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = true; 

または

SELECT COUNT(*) FROM "customers" WHERE NOT sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = false; 
+0

感謝:-)。それに応じてクエリを変更しました。しかし、今私はこのエラーが発生しています:PGError:エラー:タイプbooleanの入力構文が無効です: ""。今何? :/ –

+0

@ulf:新しいSQL文とは何ですか? –

+0

新しいステートメントは次のようになります: "sporty =?" "away"を放置するとアプリケーションがクラッシュする。 –