Ruby
Rails

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"}