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 № 1Quando 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