我有以下变量:
query = "(first_name = ?) AND (country = ?)" # string
values = ['Bob', 'USA'] # array
我需要以下结果:
result = "(first_name = Bob) AND (country = USA)" # string
替换的数量不同(1..20)。
在 Ruby 中最好的方法是什么?
我有以下变量:
query = "(first_name = ?) AND (country = ?)" # string
values = ['Bob', 'USA'] # array
我需要以下结果:
result = "(first_name = Bob) AND (country = USA)" # string
替换的数量不同(1..20)。
在 Ruby 中最好的方法是什么?
如果您不介意破坏阵列:
query.gsub('?') { values.shift }
否则只需复制数组,然后进行替换。
编辑:使用 gsub('?') 而不是正则表达式。
如果您可以控制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
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)"
values.inject(query){|s1, s2| s1.sub("?", s2)}
由于这个问题被标记为ruby-on-rails,您可以(应该)使用ActiveRecord::QueryMethods#where
Array Conditions。
ActiveRecord::PreparedStatementInvalid
如果您在 中提供了错误数量的绑定变量,则会引发这种情况values
,这样您就不必自己检查了。
这不仅优雅,因为 Rails 为您执行替换,它还通过在过程中清理您的 SQL 来帮助保护您免受SQL 注入攻击。
假设您的模型被调用User
并且query
与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