aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/hash
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/core_ext/hash')
-rw-r--r--activesupport/lib/active_support/core_ext/hash/slice.rb16
1 files changed, 16 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/hash/slice.rb b/activesupport/lib/active_support/core_ext/hash/slice.rb
index 6fe5e05330..c270e3906b 100644
--- a/activesupport/lib/active_support/core_ext/hash/slice.rb
+++ b/activesupport/lib/active_support/core_ext/hash/slice.rb
@@ -11,6 +11,11 @@ module ActiveSupport #:nodoc:
# end
#
# search(options.slice(:mass, :velocity, :time))
+ #
+ # Also allows leaving out certain keys. This is useful when duplicating
+ # a hash but omitting a certain subset:
+ #
+ # Event.new(event.attributes.without(:id, :user_id))
module Slice
# Returns a new hash with only the given keys.
def slice(*keys)
@@ -22,6 +27,17 @@ module ActiveSupport #:nodoc:
def slice!(*keys)
replace(slice(*keys))
end
+
+ # Returns a new hash without the given keys.
+ def without(*keys)
+ allowed = self.keys - (respond_to?(:convert_key) ? keys.map { |key| convert_key(key) } : keys)
+ slice(*allowed)
+ end
+
+ # Replaces the hash without the given keys.
+ def without!(*keys)
+ replace(without(*keys))
+ end
end
end
end