Rails:如何转换查询结果哈希

时间:2013-10-15 11:53:47

标签: ruby-on-rails ruby hash

我目前正在努力处理在Rails中应该非常简单的事情。

我想发出一个ActiveRecord查询并从数据库中获取模型对象,然后将它们存储在哈希中以供以后查找。

我做了一些研究,但没有找到实现这一目标的最佳方法,所以会感激一些帮助。我的目的是在循环结构中使用查找哈希减少sql查询的数量。

在下面的伪代码中,我从sms网关获取状态代码,并将与ActiveRecord表进行比较的所有状态代码描述。

#Status_codes in array format
status_codes = StatusCode.all

status_codes_hash = status_codes.to_array????

#Fetch delivery-status from sms gateway
response = HTTParty.get(myUrl)

response.each do |status|
if status_codes_hash[status.code]
    #Do stuff
end
end 

4 个答案:

答案 0 :(得分:3)

使用此代码段获取状态哈希,并将其代码作为键:

status_codes.group_by(&:code) 

该代码段是status_codes.group_by{|status| status.code}

的快捷方式

检查这样的密钥也会更好,更普遍:

if status_codes_hash.has_key?(status.code)
    # do stuff
end

答案 1 :(得分:3)

您可以通过attributes method将模型实例转换为哈希:

StatusCode.all.map(&:attributes)
#=> [{ id: 1, code: 404, ...}, { id: 2, code: 405, ...}, ...]

答案 2 :(得分:2)

您可以构造一个包含键值对数组的哈希,如下所示:

Hash[/an array of key values goes here/]

所以你要做的就是将StatusCodes转换为键值对并将其用作Hash []的输入

像这样

Hash[status_codes.map{|sc|[sc.code, sc]}]

应该做的伎俩

http://www.ruby-doc.org/core-1.9.3/Hash.html#method-c-5B-5D

答案 3 :(得分:0)

我认为inject方法可以方便地执行您正在寻找的内容。

status_codes_hash = status_codes.inject({}) do |hash, obj|
  hash[obj.code] = obj
end