d845a6d8ca31e7601a0ad7b1e12ec6ad24dca67d
[feedcatcher.git] / vendor / rails / activesupport / lib / active_support / core_ext / hash / slice.rb
1 module ActiveSupport #:nodoc:
2 module CoreExtensions #:nodoc:
3 module Hash #:nodoc:
4 # Slice a hash to include only the given keys. This is useful for
5 # limiting an options hash to valid keys before passing to a method:
6 #
7 # def search(criteria = {})
8 # assert_valid_keys(:mass, :velocity, :time)
9 # end
10 #
11 # search(options.slice(:mass, :velocity, :time))
12 #
13 # If you have an array of keys you want to limit to, you should splat them:
14 #
15 # valid_keys = [:mass, :velocity, :time]
16 # search(options.slice(*valid_keys))
17 module Slice
18 # Returns a new hash with only the given keys.
19 def slice(*keys)
20 keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
21 hash = self.class.new
22 keys.each { |k| hash[k] = self[k] if has_key?(k) }
23 hash
24 end
25
26 # Replaces the hash with only the given keys.
27 # Returns a hash contained the removed key/value pairs
28 # {:a => 1, :b => 2, :c => 3, :d => 4}.slice!(:a, :b) # => {:c => 3, :d =>4}
29 def slice!(*keys)
30 keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
31 omit = slice(*self.keys - keys)
32 hash = slice(*keys)
33 replace(hash)
34 omit
35 end
36 end
37 end
38 end
39 end
40