This post originated from an RSS feed registered with Ruby Buzz
by rwdaigle.
Original Post: What's New in Edge Rails: Some Handy Enumerable helpers
Feed Title: Ryan's Scraps
Feed URL: http://feeds.feedburner.com/RyansScraps
Feed Description: Ryan Daigle's various technically inclined rants along w/ the "What's new in Edge Rails" series.
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)
For those interested in the implemention, it’s pretty straight forward:
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:
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.