I seem to run into this very often. I need to build a Hash from an array using an attribute of each object in the array as the key.
Lets say I need a hash of example us
There is already a method in ActiveSupport that does this.
['an array', 'of active record', 'objects'].index_by(&:id)
And just for the record, here's the implementation:
def index_by
inject({}) do |accum, elem|
accum[yield(elem)] = elem
accum
end
end
Which could have been refactored into (if you're desperate for one-liners):
def index_by
inject({}) {|hash, elem| hash.merge!(yield(elem) => elem) }
end