Enumerable has received a few handy little extensions in edge Rails. The first is the ability to sum the contents of the enumerable:
orders.sum { |o| o.total * discount }
or
orders.sum(&:total)
def sum
inject(0) { |sum, element| sum + yield(element) }
end
And next we have index_by which will convert an enumerable to a hash keyed on the given block. This is definitely best explained with an example. Suppose we have an array of City objects that we want to convert to a hash based on the city names:
hash = cities.index_by(&:name)
hash #=> ["New York" => <City ...>, "London" => <City ...>]
We now have a hash of cities keyed on the citys’ names.
For those that aren’t familiar with the &:symbol syntax used as a parameter to these methods – it’s just a way to form a block that says get the value of the this symbol on the passed in object.
So in the case of:
orders.sum(&:total)
what we’re really saying is:
orders.sum { |o| o.total }
It’s just a nice shortcut to access the value of a single property.
tags: rails, rubyonrails

hash #=> ["New York" => <City ...>, "London" => <City ...>]
That's brilliant.