我目前正在努力处理在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
答案 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]}]
应该做的伎俩
答案 3 :(得分:0)
我认为inject
方法可以方便地执行您正在寻找的内容。
status_codes_hash = status_codes.inject({}) do |hash, obj|
hash[obj.code] = obj
end