From 4d20de8a50d889a09e6f5642984775fe796ca943 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 2 Dec 2011 13:00:03 +0100 Subject: Added Enumerable#pluck to wrap the common pattern of collect(&:method) *DHH* --- activesupport/CHANGELOG.md | 6 ++++-- activesupport/lib/active_support/core_ext/enumerable.rb | 7 +++++++ activesupport/test/core_ext/enumerable_test.rb | 9 ++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index be829222ff..7f1103a6d7 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,7 +1,9 @@ ## Rails 3.2.0 (unreleased) ## -* Module#synchronize is deprecated with no replacement. Please use `monitor` - from ruby's standard library. +* Added Enumerable#pluck to wrap the common pattern of collect(&:method) *DHH* + +* Module#synchronize is deprecated with no replacement. Please use `monitor` + from ruby's standard library. * (Date|DateTime|Time)#beginning_of_week accept an optional argument to be able to set the day at which weeks are assumed to start. diff --git a/activesupport/lib/active_support/core_ext/enumerable.rb b/activesupport/lib/active_support/core_ext/enumerable.rb index 9343bb7106..d9856f2e84 100644 --- a/activesupport/lib/active_support/core_ext/enumerable.rb +++ b/activesupport/lib/active_support/core_ext/enumerable.rb @@ -63,6 +63,13 @@ module Enumerable end end + # Plucks the value of the passed method for each element and returns the result as an array. Example: + # + # people.pluck(:name) # => [ "David Heinemeier Hansson", "Jamie Heinemeier Hansson" ] + def pluck(method) + collect { |element| element.send(method) } + end + # Iterates over a collection, passing the current element *and* the # +memo+ to the block. Handy for building up hashes or # reducing collections down to one object. Examples: diff --git a/activesupport/test/core_ext/enumerable_test.rb b/activesupport/test/core_ext/enumerable_test.rb index cdfa991a34..7ce7c4d52d 100644 --- a/activesupport/test/core_ext/enumerable_test.rb +++ b/activesupport/test/core_ext/enumerable_test.rb @@ -126,4 +126,11 @@ class EnumerableTests < Test::Unit::TestCase assert_equal true, GenericEnumerable.new([ 1 ]).exclude?(2) assert_equal false, GenericEnumerable.new([ 1 ]).exclude?(1) end -end + + def test_pluck_single_method + person = Struct.new(:name) + people = [ person.new("David"), person.new("Jamie") ] + + assert_equal [ "David", "Jamie" ], people.pluck(:name) + end +end \ No newline at end of file -- cgit v1.2.3