Class: Hash
- Includes:
- ActiveSupport::CoreExtensions::Hash::Conversions, ActiveSupport::CoreExtensions::Hash::DeepMerge, ActiveSupport::CoreExtensions::Hash::Diff, ActiveSupport::CoreExtensions::Hash::Except, ActiveSupport::CoreExtensions::Hash::IndifferentAccess, ActiveSupport::CoreExtensions::Hash::Keys, ActiveSupport::CoreExtensions::Hash::ReverseMerge, ActiveSupport::CoreExtensions::Hash::Slice
- Defined in:
- lib/active_support/core_ext/hash.rb,
lib/active_support/json/encoders/hash.rb,
lib/active_support/core_ext/object/blank.rb,
lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb
Overview
:nodoc:
Direct Known Subclasses
ActiveSupport::OrderedHash, HashWithIndifferentAccess, I18n::Backend::Gettext::PoData, I18n::Locale::Fallbacks
Constant Summary collapse
- MERGER =
deep_merge_hash! by Stefan Rusterholz, see www.ruby-forum.com/topic/142809
proc do |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 end
Constants included from ActiveSupport::CoreExtensions::Hash::Conversions
ActiveSupport::CoreExtensions::Hash::Conversions::DISALLOWED_XML_TYPES, ActiveSupport::CoreExtensions::Hash::Conversions::XML_FORMATTING, ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING, ActiveSupport::CoreExtensions::Hash::Conversions::XML_TYPE_NAMES
Instance Method Summary collapse
-
#as_json(options = nil) ⇒ Object
:nodoc:.
- #deep_merge!(data) ⇒ Object
- #deep_symbolize_keys ⇒ Object
- #except(*less_keys) ⇒ Object
- #slice(*keep_keys) ⇒ Object
-
#to_json(options = nil) ⇒ Object
Returns a JSON string representing the hash.
Methods included from ActiveSupport::CoreExtensions::Hash::Except
Methods included from ActiveSupport::CoreExtensions::Hash::Slice
Methods included from ActiveSupport::CoreExtensions::Hash::Diff
Methods included from ActiveSupport::CoreExtensions::Hash::Conversions
included, #rename_key, #to_query, #to_xml
Methods included from ActiveSupport::CoreExtensions::Hash::ReverseMerge
#reverse_merge, #reverse_merge!
Methods included from ActiveSupport::CoreExtensions::Hash::DeepMerge
Methods included from ActiveSupport::CoreExtensions::Hash::IndifferentAccess
Methods included from ActiveSupport::CoreExtensions::Hash::Keys
#assert_valid_keys, #stringify_keys, #stringify_keys!, #symbolize_keys, #symbolize_keys!
Instance Method Details
#as_json(options = nil) ⇒ Object
:nodoc:
43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/active_support/json/encoders/hash.rb', line 43 def as_json( = nil) #:nodoc: if if attrs = [:except] except(*Array.wrap(attrs)) elsif attrs = [:only] slice(*Array.wrap(attrs)) else self end else self end end |
#deep_merge!(data) ⇒ Object
25 26 27 |
# File 'lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb', line 25 def deep_merge!(data) merge!(data, &MERGER) end |
#deep_symbolize_keys ⇒ Object
12 13 14 15 16 17 18 |
# File 'lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb', line 12 def deep_symbolize_keys inject({}) { |result, (key, value)| value = value.deep_symbolize_keys if value.is_a?(Hash) result[(key.to_sym rescue key) || key] = value result } end |
#except(*less_keys) ⇒ Object
8 9 10 |
# File 'lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb', line 8 def except(*less_keys) slice(*keys - less_keys) end |
#slice(*keep_keys) ⇒ Object
2 3 4 5 6 |
# File 'lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb', line 2 def slice(*keep_keys) h = {} keep_keys.each { |key| h[key] = fetch(key) } h end |
#to_json(options = nil) ⇒ Object
Returns a JSON string representing the hash.
Without any options
, the returned JSON string will include all the hash keys. For example:
{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json
# => {"name": "Konata Izumi", "1": 2, "age": 16}
The keys in the JSON string are unordered due to the nature of hashes.
The :only
and :except
options can be used to limit the attributes included, and will accept 1 or more hash keys to include/exclude.
{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json(:only => [:name, 'age'])
# => {"name": "Konata Izumi", "age": 16}
{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json(:except => 1)
# => {"name": "Konata Izumi", "age": 16}
The options
also filter down to any hash values. This is particularly useful for converting hashes containing ActiveRecord objects or any object that responds to options in their to_json
method. For example:
users = User.find(:all)
{ :users => users, :count => users.size }.to_json(:include => :posts)
would pass the :include => :posts
option to users
, allowing the posts association in the User model to be converted to JSON as well.
33 34 35 36 37 38 39 40 41 |
# File 'lib/active_support/json/encoders/hash.rb', line 33 def to_json( = nil) #:nodoc: hash = as_json() result = '{' result << hash.map do |key, value| "#{ActiveSupport::JSON.encode(key.to_s)}:#{ActiveSupport::JSON.encode(value, )}" end * ',' result << '}' end |