"Gavri Fernandez" <gavri.fernandez / gmail.com> schrieb im Newsbeitrag news:e3ecfac705021308253ae8704e / mail.gmail.com... > Hi everyone, > I want to create a query based on options passed in through > an options hash to my method. > > The query would look like > "title:ruby and author:dave and publisher:oreilly" > or > "title:ruby and publisher:addison-wesley" > or > "author:dave" > or some other combination based on what options have been set in the hash. > > options[:author] |= "" followed by Array#join doesn't help me > because it would lead to successive 'and's in the query. > > What is the Ruby Idiom to achieve what I want? Lots of, here are some: >> opts = {"title"=>"ruby", "author"=>"dave", "publisher"=>"oreilly", >> "foo"=>nil} => {"title"=>"ruby", "author"=>"dave", "foo"=>nil, "publisher"=>"oreilly"} >> opts.select{|k,v|v} => [["title", "ruby"], ["author", "dave"], ["publisher", "oreilly"]] >> opts.select{|k,v|v}.map{|k,v| "#{k}=#{v}"}.join(" and ") => "title=ruby and author=dave and publisher=oreilly" Here's a more efficient variant - using #inject of course :-) >> opts.inject(nil){|s,(k,v)| v ? (s ? s << " and " : "") << k << "=" << v : >> s} => "title=ruby and author=dave and publisher=oreilly" Kind regards robert