给定一个ZipCodeInfos表,其中包含zipcode,state,city(所有字符串)字段,其中zipcode是唯一的:
zipcode,city,state
"10000", "Fooville", "AA"
"10001", "Smallville", "AA"
"10002", "Whoville", "BB"
生成整个表的哈希对象的最快方法是使用这样的密钥:
{ "10000" => {:city => "Fooville", :state => "AA" },
"10001" => {:city => "Smallville", :state => "AA" },
"10002" => {:city => "Whoville", :state => "BB" } }
我知道对于给定的记录,我可以使用.attributes生成一个哈希,其中包含字段名称,字段值的键值对,例如Zipcode.first.attributes
给我
{"id" => 1, "zipcode" => "10000", "city" => "Fooville", "state => "AA" }
但是,由于没有蛮力迭代每条记录(通过.map),我无法弄清楚如何使用zipcode创建所需的哈希值作为哈希每个节点的关键。
这是我能想到的最好的,我怀疑有一些漂亮的Ruby优点更快?
zip_info_hash = {}
ZipCodeInfo.all.map{|x| zip_info_hash[x.zip] =
{'state' => x.state, 'city' => x.city }}
答案 0 :(得分:2)
您也可以尝试:
ZipCodeInfos.all.group_by &:zipcode
将为您提供ZipCodeInfos activerecords数组的邮政编码哈希。
答案 1 :(得分:1)
您可以使用注入方法。 这是我通常使用的。
def visitors_name_email
visitors.inject({}) do |result, visitor|
result.merge(visitor.name => visitor.email)
end
end
答案 2 :(得分:0)
我想不出在这里避免map
的方法。我只对您的代码进行了一些小的更改:
zip_info=Hash[*ZipCodeInfo.all
.map{|x| [x.zip, {:city => x.city, :state => x.state}]}
.flatten]