Ruby on rails 如何在RubyonRails中将findby_sql存储字符串转换为散列

Ruby on rails 如何在RubyonRails中将findby_sql存储字符串转换为散列,ruby-on-rails,postgresql,ruby-on-rails-3.2,hstore,Ruby On Rails,Postgresql,Ruby On Rails 3.2,Hstore,这看起来非常简单,但我不知道如何将哈希字符串转换为哈希 当我做一个response.find_by_sql时,我会得到这样一个字符串 deepthought = "\"answertolife\"=>\"42\"" 但我不知道如何把它变成散列 我试过: pry(main)> Hash[deepthought] ArgumentError: odd number of arguments for Hash pry(main)> JSON.parse deepthought JS

这看起来非常简单,但我不知道如何将哈希字符串转换为哈希

当我做一个response.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\\\"\""
我看到了,但我还是想不出来。

试试这个

eval("{ #{deepthought} }")

它用大括号{}包裹了经过深思熟虑的字符串,然后使用eval

这似乎有效,但感觉很脏

JSON.parse "{ #{deepthought} }".gsub('=>', ':')

Rails4支持盒外存储,因此我可能会像Rails4一样处理字符串转换。如果查看Rails4 PostgreSQL特定的转换代码,您会发现:

在同一个文件的下方,您会发现:


把它藏在方便的地方(可能是
lib/
中的某个地方),然后通过
string\u将您的存储字符串发送到\hstore
以将其解压成散列。

有点晚,但如果您需要转换多个条目,这非常有用

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

您的
find\u by\u sql
是什么样子的?这是在一个大型sql查询中。简化后的示例类似于
Answer.find\u by_sql(“选择answers.id作为辅助,answers.deepthink作为来自answers的deepthink”)
除非您升级到本机支持hstore数据类型的Rails4,否则您将陷入令人不快的混乱。你可以看看Rails4在驱动程序中是如何解析hstore的,然后模仿一下。谢谢。我在链接的帖子上读到,这有一些严重的安全风险。我无法控制此处插入的答案,似乎恶意用户可以插入ruby。谢谢。那要干净得多。
HstorePair = begin
  quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"/
  unquoted_string = /(?:\\.|[^\s,])[^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
  /(#{quoted_string}|#{unquoted_string})\s*=>\s*(#{quoted_string}|#{unquoted_string})/
end
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