0

この問題は初めて見ました。sanitize_sql_array を実行する SQL 配列を構築していますが、Rails は戻り値に余分な不要な一重引用符を追加しています。したがって、返す代わりに:

SELECT DISTINCT data -> 'Foo' from products

戻ります:

SELECT DISTINCT data -> ''Foo'' from products

もちろん、これは Postgres が好きではありません。

コードは次のとおりです。

sql_array = ["SELECT DISTINCT %s from products", "data -> 'Foo'"]
sql_array = sanitize_sql_array(sql_array)
connection.select_values(sql_array)

より短く、より一般的なものを使用すると、同じことが起こることに注意してください。

sql_array = ["SELECT DISTINCT %s from products", "data -> 'Foo'"]
connection.select_values(send(:sanitize_sql_array, sql_array))

これを見たことがありますか?HStoreの使用と関係がありますか? 文字列 Foo は実際にはユーザーが入力した変数から来ているため、その文字列をサニタイズする必要があります。

ありがとう!

4

1 に答える 1

4

あなたはsanitize_sql_arrayhstore式を含む文字列を与えており、sanitize_sql_arrayその文字列にいくつかのhstoreのものが含まれていることを理解することを期待しています。それはあまりにも多くの質問をsanitize_sql_arrayしていて、文字列や数字のような単純なことしか知らず、PostgreSQLのSQL拡張機能や標準のSQLを解析する方法さえ知りません。たとえば、たまたま含まれている文字列と、数式を表すことになっている文字sanitize_sql_array列の違いをどのように見分けることができますか?'11 * 23'11 * 23

物を消毒しているときに弦の部分だけが見えるdata -> 'Foo'ように、を2つに分割する必要があります。sanitize_sql_array

sql_array = [ 'select distinct data -> ? from products', 'Foo' ]
sql = sanitize_sql_array(sql_array)

それはあなたが探しているSQLをあなたに与えるでしょう:

select distinct data -> 'Foo' from products
于 2012-10-02T19:31:16.910 に答える