首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby on Rails中将find_by_sql hstore字符串转换为散列

如何在Ruby on Rails中将find_by_sql hstore字符串转换为散列
EN

Stack Overflow用户
提问于 2014-04-03 10:50:08
回答 4查看 857关注 0票数 2

这看起来非常简单,但我想不出如何将哈希串转换为哈希串。

当我执行Answer.find_by_sql时,我会得到如下所示的字符串

代码语言:javascript
复制
deepthought = "\"answertolife\"=>\"42\""

但我想不出如何将其转换为哈希。

我试过了:

代码语言:javascript
复制
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?,但我还是想不通。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-04 05:44:18

Rails4支持开箱即用的hstore,所以我可能会像Rails4一样处理字符串类型转换。如果您深入查看特定于Rails4的转换代码,您会发现string_to_hstore

代码语言:javascript
复制
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

代码语言:javascript
复制
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字符串,以便将它们解压缩为散列。

票数 0
EN

Stack Overflow用户

发布于 2014-04-03 11:54:35

尝尝这个

代码语言:javascript
复制
eval("{ #{deepthought} }")

它用大括号{ }包装then字符串,然后使用eval

票数 2
EN

Stack Overflow用户

发布于 2018-08-02 07:36:37

有点晚了,但如果你需要转换多个条目,这很有效。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22826952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档