我有一个尝试将查询解析为哈希的方法。
CONTACT_SEARCH_FIELDS = ['LastUpdate','Name','RecAdd','PhoneNumber','Tag_Group','FirstName','LastName','FamilyName','FamilyHead','ClientStatus','ContactType','ClientSource','TaxId']
CONTACT_SEARCH_OPERANDS = ['=','>','<','!=','Like','BeginsWith','IsEmpty']
def search (query, page = 1)
body = [{}]*query.length
query.each_with_index do |expr, i|
body[i]["Field"] = CONTACT_SEARCH_FIELDS.index expr[0]
body[i]["Operand"] = CONTACT_SEARCH_OPERANDS.index expr[1]
body[i]["Value"] = expr[2]
end
return body
end
该方法就像这样调用
search([["FirstName", "=", "John"], ["LastName", "=", "Smith"]])
问题是运行它会产生非常奇怪的输出。
search([["FirstName", "=", "John"], ["LastName", "=", "Smith"]])
=> [{"Operand"=>0, "Value"=>"Smith", "Field"=>6}, {"Operand"=>0, "Value"=>"Smith", "Field"=>6}]
我做了一些调试,问题是数组中的所有哈希都是在每次迭代时设置的。
我不明白这背后的原因是什么。我也欢迎此代码的任何更短或更好的版本。
答案 0 :(得分:2)
更改行
body = [{}]*query.length
上述方法是,您正在创建一个 Array ,其元素是相同的Hash
个对象。
示例:
a = [{}]*3 # => [{}, {}, {}]
a.map(&:object_id) # => [18499356, 18499356, 18499356]
a[0]["a"] = 2
a # => [{"a"=>2}, {"a"=>2}, {"a"=>2}]
到
body = Array.new(query.length) { {} }
但上述意思是,您正在创建一个 Array ,其元素是不同的Hash
个对象。
示例:
a = Array.new(3) { {} } # => [{}, {}, {}]
a.map(&:object_id) # => [17643864, 17643852, 17643840]
a[0]["a"] = 2
a # => [{"a"=>2}, {}, {}]