2017-06-21 14 views
0

RubyとRailsの新機能です。ハッシュの配列を作成する必要があるという状況に苦しんでいます。コードの下に参照してください:ここでは配列内にハッシュをマージする

def self.v_and_c items 
result = [] 
items.try(:each) do |item| 
    result << item 
    if item.is_parent_variation 
    check_ancestor item 
    result << { :item_variation => @variations } 
    result << { :options => @options } 
    elsif item.is_parent_customization 
    check_ancestor item 
    result << { :customizations => @customizations } 
    result << { :ingredients => @ingredients } 
    end 
end 
result 
end 

は、関数の出力です:

{"items":[{"id":1,"name":"Cake"},{"item_variation":null},{"options":null}]} 

しかし、私はこのようにやってみたかったです。 、ループの各反復のために :

def self.v_and_c items 
result = [] 
items.try(:each) do |item| 
    item_hash = {}.merge(item) 
    if item.is_parent_variation 
    check_ancestor item 
    item_hash.merge!({ item_variation: @variations }).merge!({ options: @options}) 
    elsif item.is_parent_customization 
    check_ancestor item 
    item_hash.merge!({ customizations: @customizations }).merge!({ ingredients: @ingredients}) 
    end 
    result.push(item_hash) 
end 
result 
end 

説明:

{"items":[{"id":1,"name":"Cake","item_variation":null, "options":null} ]} 

答えて

0

を使用して、このような単純でなければなりませんitem_hashを作成し、すべての必要なハッシュをマージし、結果のハッシュを結果配列にプッシュします。

いくつかのポインタ:

  • チェック祖先は両方であれば必要に応じて、他なぜ外でそれをしていない場合は、新しいRubyのハッシュ構文
  • の世話をしますか?私は二回と呼ばれるよう
+0

あなたの迅速な応答に感謝し、実際にいくつかの時間がcheck_ancestor機能は、条件ごとに呼び出していません。 –

+0

item_hash = {} .merge(item) - >これはitem_hash = {} .merge(item:item)に変更されているのでエラーを生成しています。そうでなければ、Itemをハッシュに暗黙的に変換しないエラーが発生します。 –

+0

アイテムをハッシュと仮定しました。私の悪い。 –

0

は、それはあなたがこのような何かを試みることができる.merge方法

def self.v_and_c items 
result = [] 
items.try(:each) do |item| 
    result << item 
    if item.is_parent_variation 
    check_ancestor item 
    result = result.merge { :item_variation => @variations } 
    result = result.merge { :options => @options } 
    elsif item.is_parent_customization 
    check_ancestor item 
    result = result.merge { :customizations => @customizations } 
    result = result.merge { :ingredients => @ingredients } 
    end 
end 
result 
end 
0
def self.v_and_c items 
    [].tap do |result| 
    items.try(:each) do |item| 
    result_hash = item.dup 
    if item.is_parent_variation 
     check_ancestor item 
     result_hash.merge!({ item_variation: @variations, options: @options }) 
    elsif item.is_parent_customization 
     check_ancestor item 
     result_hash.merge!({ customizations: @customizations, ingredients: @ingredients }) 
    end 
    result << result_hash 
    end 
end 

エンド

関連する問題