1

我正在尝试创建一个函数来为 Salesforce 查询创建准备好的语句。要求是转义单引号;Salesforce 会转义其他字符。当我打电话

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

预期的输出是

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

我正在尝试使用gsub它。我的功能是

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

输出是

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

是什么导致了这个问题?

4

2 回答 2

3

当您使用带有两个参数的 gsub 时,替换字符串会以特殊方式解释。与您的情况相关的\'是替换为您的匹配词缀($'普通替换中的对应项)。为了避免这种情况,您必须为 gsub 使用一个块。

对您的代码的修复可能是这样的:

def prepared_query(soql, h = {})
  h.each do |key, val|
    val.gsub!("'", %q(\\\'))
    soql.gsub!(":#{key}"){"'#{val}'"}
  end
  soql
end
于 2013-07-22T07:14:28.820 回答
0

尝试:

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
于 2013-07-22T07:35:11.030 回答