Help us understand the problem. What is going on with this article?

railsでActiveRecordの結果をHashに変換する方法

More than 5 years have passed since last update.

rubyでArrayをHashに変換する方法

Hashクラスを利用して変換します。

keyとなる配列とvalueとなる配列を使ってハッシュを生成

keys = [:one, :two, :three] # => [:one, :two, :three]
values = [1,2,3] # => [1, 2, 3]
transposed = [keys, values].transpose => [[:one, 1], [:two, 2], [:three, 3]]
Hash[transposed] # => {:one=>1, :two=>2, :three=>3}

mapで生成された配列からハッシュを生成

primery keyをハッシュキーにして、各行をvalueに持ちたい時とかは下記の方法がいいのではと思います。

下記のテーブルとUserクラスを想定

id email
1 test@test.com
2 test2@test2.com
User
class User
end

結果

users = User.find(:all)
results = users.map{|user| [user.id, Hash[*[:email, user.email]]]}
Hash[results] # => {1=>{:email=>"test@test.com"}, 2=>{:email=>"test2@test2.com"}}

Hash[配列]とHash[配列]と``が付く場合と付かない場合がありますが、その理由を次に説明します。

(追記)単純にハッシュにするなら各行でattributesを呼ぶだけでよさそうです、、

users = User.find(:all)
results = users.map{|user| [user.id, user.attributes]}
Hash[results] # => {1=>{:email=>"test@test.com"}, 2=>{:email=>"test2@test2.com"}}

ArrayをHashにするパターン

Hashクラスを使用してkey, valueの配列をハッシュにするには下記のようなパターンがあります。

["key1", "value1", "key2", "value2"]をハッシュにする場合

Hash[*["key1", "value1", "key2", "value2"]] # => {"key1"=>"value1", "key2"=>"value2"}

[["key1", "value1"], ["key2", "value2"]]

Hash[[["key1", "value1"], ["key2", "value2"]]] # => => {"key1"=>"value1", "key2"=>"value2"}

もしくは

Hash[*[["key1", "value1"], ["key2", "value2"]].flatten(1)] # => {"key1"=>"value1", "key2"=>"value2"}
t4kmru
Rails初心者です!最近ではドメイン駆動設計にはまってます!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away