/ Problema da função Gsub no Ruby - ruby

Problema da função Gsub em Ruby - ruby

Estou tentando criar uma função para criar instruções preparadas para consultas do Salesforce. O requisito é escapar de aspas simples; outros caracteres são escapados pelo Salesforce. Quando eu ligo

prepared_query("Select Id from Account where Id = :id and Name = :name limit 1", {:id => "00001234", :name => "John "Smith"}

a saída esperada é

"Select Id from Account where Id = "00001234" and Name = "John "Smith" limit 1"

Estou tentando usar gsub por esta. Minha função é

def prepared_query(soql, *args)
if args[0].is_a? Hash
args[0].each do |key, val|
val.gsub!(""", %q(\"))
soql.gsub! ":#{key}", ""#{val}""
end
end
end

A saída é

"Select Id from Account where Id = "00001234" and Name = "John limit 1Smith" limit 1"

O que está causando esse problema?

Respostas:

3 para resposta № 1

Quando você usa o gsub com dois argumentos, a string de substituição é interpretada de maneira especial. O que é relevante para o seu caso é que " é substituído com o afixo do seu jogo (a contraparte de $" na substituição ordinária). Para evitar que você tenha que usar um bloco para gsub.

Uma correção para o seu código pode ser assim:

def prepared_query(soql, h = {})
h.each do |key, val|
val.gsub!(""", %q(\"))
soql.gsub!(":#{key}"){""#{val}""}
end
soql
end

0 para resposta № 2

Experimentar:

def prepared_query(soql, *args)
if args[0].is_a? Hash
args[0].each do |key, val|
soql.gsub! ":#{key}", "#{val.inspect}"
end
end
soql
end