How to store the same key multi times in a Hash ?

given an Arra tags[]

I need to produce a resulting Hash as following ..

{ "$in" => [tags[0]], "$in" =>[tags[1], ...}

in which the key should be always the same and the value being an
Array

I tried this :

         myHash = {}
         tags.each do |tag|
           h = {"$in" => [tag]}
           myHash.merge!(h)
         end

but the merge! is only changing the value ... (as the key is always
the same ..)
(there is no += as with Array class ...)

thanks for your feedback

By definition, a hash stores a single value for a given key. The
closest you'll get is to make the value an array of all the things for
the key in question.

Fred

I agree with Frederick Cheung.

Your code will be like this :

  myHashes = []
  tags.each do |tag|
    h = {"$in" => [tag]}
    myHash << h
  end

and myHashes will contains :

  [{ "$in" => [tags[0]]}, {"$in" =>[tags[1]}, ...]

which myHashes is an array of hashes.

Hope this can help you :slight_smile:

thanks a lot .. !!!

this is to be used with MongoID as a criteria

criteria.where(:tags => { "$in" => [tags[0]], "$in"
=>[tags[1]] }).to_a

any suggestion with json structure ?

thanks Fred

this is to be used with MongoID as a criteria

criteria.where(:tags => { "$in" => [tags[0]], "$in"
=>[tags[1]] }).to_a

any suggestion with json structure ?

You can't repeat keys in a json hash either. What are you actually
trying to do?

Fred

I need to write a Mongoid criteria

criteria.where(:tags => myStruct ).to_a

in which myStruct will have this structure { "$in" =>
[check_tags[0]], "$in" =>[check_tags[1]] , .. }
built from a check_tags Array

it's a sequence of .in criteria
I am checking if ALL of the elements of check_tags[] are included in a
Mongoid record Array field :tags

the simplest Mongoid criteria:
criteria.in(:tags => tags)
just perform a checking on ANY element included, not ALL

Thanks fred .. found how to do it....
there is a specific criteria for it ( I did not fully understand when
reading it the first time...)

Criteria#all_in:
Matches if all values provided match, useful for doing exact matches
on arrays.

so writing :
criteria.all_in(:tags => tags ).to_a

did it ...

I'll try to give an eye to the underlaying Mongoid ruby code in charge
of doing that ....