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)"

你必须在你的字符串中替换?为。%squery

于 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 回答
1
values.inject(query){|s1, s2| s1.sub("?", s2)}
于 2013-07-08T10:45:45.747 回答
0

由于这个问题被标记为,您可以(应该)使用ActiveRecord::QueryMethods#whereArray Conditions

ActiveRecord::PreparedStatementInvalid如果您在 中提供了错误数量的绑定变量,则会引发这种情况values,这样您就不必自己检查了。

这不仅优雅,因为 Rails 为您执行替换,它还通过在过程中清理您的 SQL 来帮助保护您免受SQL 注入攻击

例子

假设您的模型被调用User并且queryvalue您的问题一样,则:

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 回答