3

次の変数があります。

query = "(first_name = ?) AND (country = ?)" # string
values = ['Bob', 'USA'] # array

次の結果が必要です。

result = "(first_name = Bob) AND (country = USA)" # string

置換の数はさまざまです (1..20)。

Rubyでそれを行う最良の方法は何ですか?

4

5 に答える 5

3

配列を破棄しても構わない場合:

query.gsub('?') { values.shift }

それ以外の場合は、配列をコピーしてから置換を行います。

編集:正規表現の代わりに gsub('?') を使用。

于 2013-07-08T10:14:41.113 に答える
3

query文字列を制御できる場合は、 String#%演算子が必要です。

query = "(first_name = %s) AND (country = %s)" # string
values = ['Bob', 'USA'] # array
result = query % values
#=> "(first_name = Bob) AND (country = USA)"

?文字列をに置き換える必要が%sありますquery

于 2013-07-08T10:15:31.707 に答える
1
query = "(first_name = ?) AND (country = ?)"
values = ['Bob', 'USA']
result = query.dup
values.each{|s| result.sub!("?",s) }
p query
# >> "(first_name = Bob) AND (country = USA)"
于 2013-07-08T10:15:23.383 に答える
0

この質問にはActiveRecord::QueryMethods#whereタグが付けられているため、Array Conditionsを使用できます (使用する必要があります) 。

ActiveRecord::PreparedStatementInvalidで間違った数のバインド変数を指定すると、これvaluesが発生します。これにより、これを自分で確認する必要がなくなります。

Rails が置換を実行するため、これはエレガントであるだけでなく、その過程で SQL をサニタイズすることにより、SQL インジェクション攻撃から保護するのにも役立ちます。

あなたのモデルが呼び出され、あなたの質問のようにあると仮定するとUserqueryこれvalueは次のとおりです。

User.where(query, *values)

...次のようなSQLを生成します:

SELECT * FROM users WHERE first_name = 'Bob' AND country = 'USA';

表示のみ

上記の例では、クエリが実行されます。生成された SQL を実行せずに表示するには、次のように呼び出しActiveRecord::Relation#to_sqlます。

User.where(query, *values).to_sql
于 2013-07-08T19:28:03.757 に答える