From: Jagadeesh Date: 2010-01-08T12:55:13+09:00 Subject: Re: Help On Jan 7, 3:08 pm, Jesús Gabriel y Galán wrote: > On Thu, Jan 7, 2010 at 10:55 AM, Jagadeesh wrote: > > On Jan 7, 2:33 pm, Jesús Gabriel y Galán > > wrote: > >> On Thu, Jan 7, 2010 at 10:20 AM, Jagadeesh wrote: > >> > hi Gurus, > > >> > Here my data structure > > >> > 1234 => { 'open' => '1234-1', > >> >               'analyzed' => '1234-2', > >> >               'feedback' => '1234-3', > >> >               'closed' => '1234-4' > >> >             } > >> > 3455 => { 'open' => '3455-1', > >> >               'analyzed' => '34552', > >> >               'feedback' => '3455-3', > >> >               'closed' => '3455-4' > >> >             } > > >> > My task is to display numbers [like 1234 or 3455] if they have ('open' > >> > OR 'analyzed') AND ('closed' OR 'feedback')  keys. I tried following > >> > code > > >> > puts numbers if $DATA[pr].has_key?( ( ('closed' || 'feedback') > >> >                                                         && ('open' || > >> > 'analyzed') ) ) > > >> > I am not sure what is wrong with it but its not testing these > >> > conditions and printing all numbers. Please help me understanding > >> > has_key method and writing correct condition. > > >> The has_key? method receives a single key to be checked in the hash. > >> In your snippet, what you are passing to the has_key? method is the > >> result of evaluating this: > > >> ( ('closed' || 'feedback') && ('open' || 'analyzed') ) > > >> which is: > > >> irb(main):002:0> ( ('closed' || 'feedback') && ('open' || 'analyzed') ) > >> => "open" > > >> So you are testing only for the "open" key. I don't know what $DATA or > >> pr or numbers are in your snippet, but you are testing only for the > >> key "open". > > >> Hope this helps, > > >> Jesus. > > > $DATA=>{'1234' => { 'open' => '1234-1', > >               'analyzed' => '1234-2', > >               'feedback' => '1234-3', > >               'closed' => '1234-4' > >             }, > >        '3455' => { 'open' => '3455-1', > >               'analyzed' => '34552', > >               'feedback' => '3455-3', > >               'closed' => '3455-4' > >              } > > } > > > and am reading it in loop so pr will have 1234, 3455 etc. > > As Stefano said: > > irb(main):001:0> $DATA = { > irb(main):002:1* 1234 => { 'open' => '1234-1', > irb(main):003:2*               'analyzed' => '1234-2', > irb(main):004:2*               'feedback' => '1234-3', > irb(main):005:2*               'closed' => '1234-4' > irb(main):006:2>             }, > irb(main):007:1* 3455 => { 'open' => '3455-1', > irb(main):008:2*               'analyzed' => '34552', > irb(main):009:2*               'feedback' => '3455-3', > irb(main):010:2*               'closed' => '3455-4' > irb(main):011:2>             }} > => {3455=>{"open"=>"3455-1", "analyzed"=>"34552", "closed"=>"3455-4", > "feedback"=>"3455-3"}, 1234=>{"open"=>"1234-1", "analyzed"=>"1234-2", > "closed"=>"1234-4", "feedback"=>"1234-3"}} > irb(main):012:0> $DATA.each do |k,v| > irb(main):013:1* puts k if ( (v.has_key?('closed') || > v.has_key?('feedback')) && ((v.has_key?('open') || > v.has_key?('analyzed')))) > irb(main):014:1> end > 3455 > 1234 > > Hope this helps, > > Jesus. Thank you so much. It is working now. Thanks for all your help. Thanks