2011-09-08 50 views
1

所以我有下面的業務發生,這工作...但即使作爲一個新手,我認爲它看起來很可怕。Rails - 使用HTTParty遍歷一個json哈希和數組

的結構是: 「每個產品都有藝術家的數組只返回產品用正確的藝術家。」

def fetch_products(artist) 
    result = get("/#{@id}/products.js", :headers => {'Accept' => 'application/json'}) 
    products = [] 

    result.each do |product| 
    if not product['artists'].find_all {|i| i['name'].downcase == artist.downcase }.empty? 
     products << product 
    end 
    end 
    products 
end  

如果任何人有我喜歡的任何提示坐上了一些更好的理解'更好'和/或'更快'的方式來做到這一點!

回答

1

該代碼並沒有太糟糕的樣子。但是,您可以跳過result.each循環,直接使用find_all即可獲取所有正在查找的實例而不循環。

一個簡單的例子:

x={ :a => ['a','b'] , :b => ['c','d'], :c=>['b','e']} 

x.find_all { |k,v| !v.grep(/^A$/i).empty? } 

返回:

[[:a, ["a", "b"]]] 

grep方法搜索v(散列值 - 的陣列),用於匹配某正則表達式中的任何條目。

如果你不喜歡使用grep可以直接實現你的邏輯:

x.find_all {|k,v| v.any? { |m| m.downcase == "a" } } 
+0

這是偉大的!第二個例子很清楚,應該很棒。感謝您的高舉。我正在努力如何正確地把塊放在塊內,但這顯而易見。 – Galaxy