0

postgresでrails2のアクティブレコード条件を使用する際に問題が発生します。私の問題は、このクエリを使用しようとするときです(geokitを使用していますが、それは問題ではありません)

Table.all(:conditions => ["id IN (?)", id_array.join(",")], :origin => origin, :within => 20)

私はこの問題を抱えています:

ActiveRecord::StatementInvalid: PG::Error: ERROR:  invalid input syntax for integer: "21,28"
LINE X: ...OM "tables" WHERE (((id IN (E'21,28...

なぜそこに「E」を入れるのですか、どうすればそれを取り除くことができますか?

4

5 に答える 5

3

を使用id_array.join(",")して、単一の文字列を関数に渡します。生成されたSQLクエリに入れると、すべての文字列がエスケープされて一重引用符で囲まれるため、このINステートメントではコンマ区切りの整数しか使用できないため、当然SQLエラーが発生します。

簡単な解決策は、配列を関数に直接渡すことです。次に、ActiveRecordはそれ自体でSQLに正しい値を作成します。次のように使用できます。

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)

または、まったく同じSQLクエリを生成するこのさらにルビーのような構文を使用することもできます。

Table.all(:conditions => {:id => id_array}, :origin => origin, :within => 20)
于 2012-06-07T19:52:38.567 に答える
1

あなたはすでに別の道に導かれています。しかし、あなたの質問に答えるために:

なぜそこに「E」を入れているのですか...

これがPostgreSQLのエスケープ文字列構文ですEPostgreSQLのデフォルトの動作はバージョン9.1で変更され、最初の一重引用符の前にある場合を除いて、円記号エスケープは解釈されなくなりました。新しい動作はSQL標準を反映しています。

 'one backslash: \'  -- backslash has no special meaning in Postgres 9.1
E'one backslash: \\' -- must use E'' syntax to interpret escape sequences

一部のクライアントはそれを安全に再生し、すべてEの文字列リテラルの前に配置して、PostgreSQLのバージョンや特にの設定に関係なく同じ動作を取得します。他の人はサーバーに設定について尋ね、それに応じて構文を適応させます。いずれにせよ、バックスラッシュを含まない文字列リテラルの前にを置くことは、(ごくわずかな)CPUサイクルの無駄です。standard_conforming_stringsE

于 2012-06-07T23:49:37.543 に答える
0

私はあなたが値に参加する必要があるとは思わない。Rails 2でもそうですが、これを試してみてください。

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)
于 2012-06-07T19:51:53.920 に答える
0

代わりにこれを試してください:

Table.all(:conditions => ["id IN (#{id_array.join(",")})"], :origin => origin, :within => 20
于 2012-06-07T19:52:02.647 に答える
0

mysqlがcount()関数を実行しようとしたときに同じ問題が発生し、それを修正するために使用した構文は

Issue.all(:conditions => "status_id IN (5, 15, 19, 21, 25)").count
于 2015-06-15T18:18:56.553 に答える