File: active_support/core_ext/hash/slice.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: ActiveSupport#1
  module: CoreExtensions#2
  module: Hash#3
  module: Slice#17
has properties
method: slice / 1 #19
method: slice! / 1 #29

Code

   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