/ / Funkcja Gsub działa w Ruby - ruby

Problem z funkcją Gsub w Ruby - ruby

Próbuję utworzyć funkcję do tworzenia gotowych instrukcji dla zapytań Salesforce. Wymagane jest unikanie pojedynczych cudzysłowów, inne znaki są usuwane przez Salesforce.

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

oczekiwany wynik to

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

Próbuję użyć gsub dla tego. Moja funkcja to

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

Wyjście to

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

Co powoduje ten problem?

Odpowiedzi:

3 dla odpowiedzi № 1

Kiedy używasz gsub z dwoma argumentami, łańcuch zastępczy jest interpretowany w specjalny sposób. To, co jest istotne w twoim przypadku, jest takie " zastępuje się przymiarem twojego meczu (odpowiednikiem $" w zwykłej wymianie). Aby tego uniknąć, musisz użyć bloku dla gsub.

Poprawka do twojego kodu może wyglądać następująco:

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

0 dla odpowiedzi nr 2

Próbować:

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