轨道&x2B;activerecord:如何从具有特定字段的表中创建散列';s值作为键

轨道&x2B;activerecord:如何从具有特定字段的表中创建散列';s值作为键,activerecord,hash,Activerecord,Hash,给定一个包含zipcode、state、city(所有字符串)字段的ZipCodeInfos表,其中zipcode是唯一的: zipcode,city,state "10000", "Fooville", "AA" "10001", "Smallville", "AA" "10002", "Whoville", "BB" 如果zipcode是如下所示的键,则生成整个表的哈希对象的最快方法是什么: { "10000" => {:city => "Fooville", :state =

给定一个包含zipcode、state、city(所有字符串)字段的ZipCodeInfos表,其中zipcode是唯一的:

zipcode,city,state
"10000", "Fooville", "AA"
"10001", "Smallville", "AA"
"10002", "Whoville", "BB"
如果zipcode是如下所示的键,则生成整个表的哈希对象的最快方法是什么:

{ "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" }
但是,除了对每个记录(via.map)进行暴力迭代之外,我无法完全理解如何使用zipcode作为散列的每个节点的键来创建所需的散列

这是我能想到的最好的了,我怀疑有一些漂亮的红宝石好东西更快吗?

zip_info_hash = {}
ZipCodeInfo.all.map{|x| zip_info_hash[x.zip] = 
                       {'state' => x.state, 'city' => x.city }}
您可以使用注入方法。 这是我通常使用的

def visitors_name_email
  visitors.inject({}) do |result, visitor|
    result.merge(visitor.name => visitor.email)
  end
end

我想不出一个办法来避免
map
。我只会对您的代码做一些小的更改:

zip_info=Hash[*ZipCodeInfo.all
                          .map{|x| [x.zip, {:city => x.city, :state => x.state}]}
                          .flatten]
您也可以尝试:

ZipCodeInfos.all.group_by &:zipcode 
将得到ZipCodeInfosActiveRecords数组的邮政编码哈希