3

我目前正在努力解决在 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

4 回答 4

4

使用此代码段以代码作为键获取您的状态哈希:

status_codes.group_by(&:code) 

该片段是一个快捷方式status_codes.group_by{|status| status.code}

像这样检查密钥也会更好,更通用:

if status_codes_hash.has_key?(status.code)
    # do stuff
end
于 2013-10-15T12:01:33.443 回答
3

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

StatusCode.all.map(&:attributes)
#=> [{ id: 1, code: 404, ...}, { id: 2, code: 405, ...}, ...]
于 2013-10-15T12:05:05.907 回答
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

于 2013-10-15T12:09:46.557 回答
0

我认为,该inject方法是一种方便的方法来做你正在寻找的东西。

status_codes_hash = status_codes.inject({}) do |hash, obj|
  hash[obj.code] = obj
end
于 2013-10-15T12:03:50.737 回答