7

フィールド zipcode、state、city (すべての文字列) を持つテーブル ZipCodeInfos が与えられます。ここで、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" } }

Zipcode.first.attributes特定のレコードに対して .attributes を使用して、フィールド名、フィールド値のキー、値のペアでハッシュを生成できることを知っています。たとえば、

{"id" => 1, "zipcode" => "10000", "city" => "Fooville", "state => "AA" }

しかし、(.map を介して) 各レコードをブルート フォースで反復処理しないと、ハッシュの各ノードのキーとして郵便番号を使用して目的のハッシュを作成する方法がわかりません。

これは私が思いつくことができる最高のものであり、より高速な気の利いた Ruby の利点があるのではないかと思います。

zip_info_hash = {}
ZipCodeInfo.all.map{|x| zip_info_hash[x.zip] = 
                       {'state' => x.state, 'city' => x.city }}
4

3 に答える 3

0

ここを避ける方法が思いつきませんmap。私はあなたのコードにいくつかのマイナーな変更を加えるだけです:

zip_info=Hash[*ZipCodeInfo.all
                          .map{|x| [x.zip, {:city => x.city, :state => x.state}]}
                          .flatten]
于 2014-05-15T10:56:07.097 に答える