2016-04-05 10 views
1

私はSQLクエリからitemsの結果を持っています。これらの結果を使用して、productsという新しいハッシュ配列を作成したいと考えています。私がやっている道は正しいとは思わない。各行を反復処理しながら、私は以下の擬似コードのような行のいくつかのキーを条件付きで処理する必要があります。sql結果を反復処理して新しいハッシュ配列を生成します

items = retrieve_items_from_db 

products = items.map do |row| 
    { 
    row.each do | k, v| 
     if k == "Color" 
     #go do something and add updated key, value pair to products 
     else puts "SKEY:#{k} VALUE: #{v}" 
     # add k,v to products 
     k => v 
    end 
    } 
end 

何か指針または提案がありますか?私はmapの代わりにinject({})を使ってみました。

+0

これは何の目的ですか?また、あなたは '終わり 'を欠いており、'それぞれはあなたの考えをしません。あなたは 'products = items.map {| row | row.each_with_object({}){|(k、v)、obj | obj [k] = k == "Color"? some_color_method(v):v}} ' – engineersmnky

答えて

0

ここでやろうとしているのはクールですが、条件文をハッシュに入れることはできません。

I.e.あなたが行うことはできません。

{ 
    if 2 == 2 
    math: "correct" 
    else 
    math: "incorrect" 
    end 
} 

代わりに実行する必要があります:

if 2 == 2 
    { math: "correct" } 
else 
    { math: "incorrect" } 
end 

あなたが一つに複数のハッシュを結合する必要がある場合は、Hash#merge方法が有用です。例えば

{ a: "a", b: "DEFAULT" }.merge({ b: "b", c: "c" }) 
# => { a: "a", b: "b", c: "c" } 

あなたは第2のハッシュが最初の1の値をオーバーライドしていることがわかります。

あなたは(同じことを行いますが、あまり怖い響きですかreduce、)、しかし、あなたは配列に配列を変換しているので、mapを使用する方が簡単だろう、ここでinjectを使用することができます。

products = items.map do |row| 
    row.map do |k, v| 
    if k == "Color" 
     # go do something 
     # add transformed k, v to products 
    else 
     puts "SKEY:#{k} VALUE: #{v}" 
     k => v # add k, v to products 
    end  
    end 
end.flatten 
0

アレイペアの配列をハッシュに変換しますが、私にとってはこれが厄介です:

items = retrieve_items_from_db 
products = items.map do |row| 
    Hash[row.map do | k, v| 
    if k == "Color" 
     #go do something and add updated key, value pair to products 
     [transform_key(k), transform_value(v)] 
    else 
     puts "SKEY:#{k} VALUE: #{v}" 
     # add k,v to products 
     [k, v] 
    end 
    end] 
end 
0

私はこの方法が最も簡単に読み込むと思う::

items = retrieve_items_from_db 

products = items.map do |row| 
    product = {} 
    row.each do | k, v| 
    if k == "Color" 
     #go do something and add updated key, value pair to products 
     product[transform_key(k)] = transform_value(v) 
    else 
     puts "SKEY:#{k} VALUE: #{v}" 
     # add k,v to products 
     product[k] = v 
    end 
    end 
    product 
end 

あなたはまた、ハッシュを使用することができます:: []に変換すること、ネストされたマッピング作られ、その後、平坦化

products = items.map do |row| 
if row.keys.include?(:price) 
    row = row.merge(price: "#{row[:price]} dollars") 
else 
    row = row.merge(price: "not available for sale") 
end 
next row 
end 
+0

ありがとうございました。大きな回答、私は1つを選ぶ必要がありました。 –

関連する問題