odiszapc
odiszapc

Reputation: 4109

Convert SQL result to hash with ID keys with Ruby

I have the following array (SQL result):

[
  {:id => 1, :field1 => "one", :field2 => "two"},
  {:id => 2, :field1 => "one", :field2 => "two"},
  ...
]

What I want is:

{
  1 => {:field1 => "one", :field2 => "two"},
  2 => {:field1 => "one", :field2 => "two"},
  ...
}

Now I do like the following:

data = {}
result.each do |row|
  data[row[:id]] = {:field1 => row[:field1], :field2 => row[:field2]}
end

I'm absolutely sure that's wrong way. What is the best way to do it with Ruby? Is there are any snippet like map or something else?

Upvotes: 3

Views: 1020

Answers (3)

hs-
hs-

Reputation: 1026

Hash[arr.map { |h| [h.delete(:id), h] }]

Upvotes: 6

megas
megas

Reputation: 21791

One line :)

hash = arr.clone.each_with_object({}) { |e,res| res[e.delete(:id)] = e }

clone is for not destroying arr variable

Upvotes: 2

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230306

Something like this, maybe?

arr = [
  {:id => 1, :field1 => "one", :field2 => "two"},
  {:id => 2, :field1 => "one", :field2 => "two"}
]

hash = arr.each_with_object({}) do |el, memo|
  id = el.delete(:id)
  memo[id] = el
end

hash # => {1=>{:field1=>"one", :field2=>"two"}, 2=>{:field1=>"one", :field2=>"two"}}

Upvotes: 1

Related Questions