ruby-on-rails Rails:如何转换查询结果哈希

dy2hfwbg  于 2023-04-13  发布在  Ruby
关注(0)|答案(5)|浏览(191)

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

lnxxn5zx1#

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

status_codes.group_by(&:code)

代码段是status_codes.group_by{|status| status.code}的快捷方式
像这样检查密钥也会更好,更通用:

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

toe950272#

您可以通过attributes方法将模型示例转换为散列:

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

eoigrqb63#

你可以用一个键值对数组来构造一个Hash,如下所示:

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

elcex8rz

elcex8rz4#

我认为inject方法是一种方便的方法来完成您正在寻找的任务。

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

d8tt03nd5#

ActiveRecord的最短版本:

Currency.all.map { [_1.iso_code, _1] }.to_h

返回:

=> { 'USD' => #<Currency id: 1, territory: "United States", name: "United States dollar", symbol: "$", iso_code: "USD", ...

相关问题