user3868832
user3868832

Reputation: 620

Dynamically adding to an existing key value pair in ruby

Ok, so 8 months into Ruby Hashes are still proving somewhat of an enigma.

I pull 10 records from the database, each with its own category field. Many of the records with share the same category, so I want them grouped by their categories in a hash.

I understand that the Key's are always unique, which is what makes a Hash a Hash. What I am struggling to do is add values to the existing key in the hash.

def self.categorise_events
    hash = {}
    self.limit(10).map do |event|
        if hash.key?(event.event_type) #check if the key already exists
            hash[event.event_type][event] #add the event record to that key
        else
            hash[event.event_type] = event #create the key if it doesn't exist and add the record 
        end
    end
    hash
end 

This is more of a gist of what I am trying to achieve. I've had other compositions which have been closer but still not quite doing it.

Upvotes: 0

Views: 1229

Answers (2)

rafb3
rafb3

Reputation: 1702

You can add to an existing hash like

hash[key] = value

but in your case, your value is a collection of values, so it's an array

hash[key] = []
hash[key] << value

so you can add to an existing group with

unless hash.key?(event.event_type)
  hash[event.event_type] = []
end

hash[event.event_type] << event

Now, this can be accomplished with the builtin method #group_by as seen on the documentations. But in your case, because it's using ActiveRecord, you can consider using #group to group records using SQL and greatly improving the performance of the grouping

self.limit(10).group(:event_type)

Check out the docs here.

Upvotes: 2

shirakia
shirakia

Reputation: 2409

Key is always uniq. So if you want to add values to a key, that value should be Array.

In this situation you can use group_by. Try

hash = self.limit(10).group_by{|e| e.event_type}

It returns a Hash whose keys are event_type and values are Array of records.

Upvotes: 1

Related Questions