1

I'm a little uncomfortable using chain of methods in Ruby. Here, I'm using such a chain.

So the question is, Tell me a better way to do the same.

I have this line run,

p["All_Products"]["Product"].map{|h| h["Categories"]["Category"] rescue nil }.compact.flatten.uniq

p equals this,

{"All_Products"=>
  {"Product"=>
    [{"ProductCode"=>"GFT",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1553", "CategoryName"=>"Bath and Body"}]}},
     {"ProductCode"=>"GF-honey",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"GF-malbec",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"GF-olives",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"HC-flatiron",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1554", "CategoryName"=>"Hair Care"}]}}
    ]
  } 
}

Finally I'm getting this,

[{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
 {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
 {"CategoryID"=>"1553", "CategoryName"=>"Bath and Body"},
 {"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
 {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"},
 {"CategoryID"=>"1554", "CategoryName"=>"Hair Care"},
 {"CategoryID"=>"1673", "CategoryName"=>"Sweets"},
 {"CategoryID"=>"1477", "CategoryName"=>"Home Decor"},
 {"CategoryID"=>"1516", "CategoryName"=>"Furniture"},
 {"CategoryID"=>"1517", "CategoryName"=>"Home Accessories"},
 {"CategoryID"=>"1814", "CategoryName"=>"Apparel"},
 {"CategoryID"=>"1815", "CategoryName"=>"Women"},
 {"CategoryID"=>"1816", "CategoryName"=>"Men"}]
2
  • 1
    What's the question exactly? A better way to do the same? Commented Oct 15, 2014 at 8:47
  • Yes a better way to do the same Commented Oct 15, 2014 at 8:49

1 Answer 1

1

Will this help?:

products = {"All_Products"=>
  {"Product"=>
    [{"ProductCode"=>"GFT",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1553", "CategoryName"=>"Bath and Body"}]}},
     {"ProductCode"=>"GF-honey",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"GF-malbec",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"GF-olives",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"},
          {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}]}},
     {"ProductCode"=>"HC-flatiron",
      "Categories"=>
       {"Category"=>
         [{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
          {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
          {"CategoryID"=>"1554", "CategoryName"=>"Hair Care"}]}}
    ]
  } 
}

then you can:

puts products['All_Products']['Product'].
     collect{ |product| product['Categories'] && product['Categories']['Category'] }.
     flatten.uniq

result:

[{"CategoryID"=>"1513", "CategoryName"=>"Beauty"},
 {"CategoryID"=>"1515", "CategoryName"=>"Specials"},
 {"CategoryID"=>"1553", "CategoryName"=>"Bath and Body"},
 {"CategoryID"=>"1514", "CategoryName"=>"Gourmet Food"}, 
 {"CategoryID"=>"1632", "CategoryName"=>"Specialty Items"}, 
 {"CategoryID"=>"1554", "CategoryName"=>"Hair Care"}]

Also, please try not to create variable names such as p, puts, do etc. They're reserved Ruby methods.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.