2017-06-21 130 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}]} 

但我想做的事是這樣的。

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

回答

0

你可以嘗試這樣的事:

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 

說明: For循環的每次迭代中,創建一個item_hash併合並所有必需的散列,然後將結果散列推送到結果數組中。

幾個要點:

  • 保重新的Ruby哈希語法
  • 如果需要在這兩個如果檢查祖先和別人爲什麼不外面做呢?
+0

感謝您的快速回復,實際上有時check_ancestor函數調用不按照條件,所以我來了兩次。 –

+0

item_hash = {} .merge(item) - >這是創建錯誤,所以我已經將它改爲item_hash = {} .merge(item:item),否則就會拋出錯誤,無法將Item隱式轉換爲Hash。 –

+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