这看起来非常简单,但我想不出如何将哈希串转换为哈希串。
当我执行Answer.find_by_sql时,我会得到如下所示的字符串
deepthought = "\"answertolife\"=>\"42\""
但我想不出如何将其转换为哈希。
我试过了:
pry(main)> Hash[deepthought]
ArgumentError: odd number of arguments for Hash
pry(main)> JSON.parse deepthought
JSON::ParserError: 757: unexpected token at '"answertolife"=>"42"'
pry(main)> deepthought.to_json
=> "\"\\\"answertolife\\\"=>\\\"42\\\"\""
我看到了How do I convert a String object into a Hash object?,但我还是想不通。
发布于 2014-04-04 05:44:18
Rails4支持开箱即用的hstore,所以我可能会像Rails4一样处理字符串类型转换。如果您深入查看特定于Rails4的转换代码,您会发现string_to_hstore
def string_to_hstore(string)
if string.nil?
nil
elsif String === string
Hash[string.scan(HstorePair).map { |k, v|
v = v.upcase == 'NULL' ? nil : v.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
k = k.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
[k, v]
}]
else
string
end
end
再往下一点,在同一个文件中,你会发现HstorePair
HstorePair = begin
quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"/
unquoted_string = /(?:\\.|[^\s,])[^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
/(#{quoted_string}|#{unquoted_string})\s*=>\s*(#{quoted_string}|#{unquoted_string})/
end
将其存储在某个方便的地方(可能在lib/
中的某个地方),并通过该string_to_hstore
发送hstore字符串,以便将它们解压缩为散列。
发布于 2014-04-03 11:54:35
尝尝这个
eval("{ #{deepthought} }")
它用大括号{ }包装then字符串,然后使用eval
发布于 2018-08-02 07:36:37
有点晚了,但如果你需要转换多个条目,这很有效。
def hstore_to_hash(hstore)
values = {}
hstore.gsub(/"/, '').split(",").each do |hstore_entry|
each_element = hstore_entry.split("=>")
values[each_element[0]] = each_element[1]
end
values
end
https://stackoverflow.com/questions/22826952
复制相似问题