Skip to content

Commit

Permalink
stringify_keys and symbolize_keys have stable results.
Browse files Browse the repository at this point in the history
Rails 6 uses the `Hash.transform_keys` found in Ruby 2.5 and later, and that method enumerates keys based on insertion order.  Calling `symbolize_keys`, `stringify_keys`, and their bang variants will result in the same hash every time -- the value for any key where a collision occurs is the last assigned in that enumeration

In the docs for Hash --  https://ruby-doc.org/core-2.5.0/Hash.html

> Hashes enumerate their values in the order that the corresponding keys were inserted.
  • Loading branch information
corprew committed May 28, 2019
1 parent f09ca65 commit 82ee7a0
Showing 1 changed file with 4 additions and 8 deletions.
12 changes: 4 additions & 8 deletions guides/source/active_support_core_extensions.md
Expand Up @@ -2633,14 +2633,12 @@ The method `stringify_keys` returns a hash that has a stringified version of the
# => {"" => nil, "1" => 1, "a" => :a}
```

In case of key collision, one of the values will be chosen. The chosen value may not always be the same given the same hash:
In case of key collision, the value will be the one most recently inserted into the hash.

```ruby
{"a" => 1, a: 2}.stringify_keys
# The result could either be
# The result will be
# => {"a"=>2}
# or
# => {"a"=>1}
```

This method may be useful for example to easily accept both symbols and strings as options. For instance `ActionView::Helpers::FormHelper` defines:
Expand Down Expand Up @@ -2677,14 +2675,12 @@ The method `symbolize_keys` returns a hash that has a symbolized version of the

WARNING. Note in the previous example only one key was symbolized.

In case of key collision, one of the values will be chosen. The chosen value may not always be the same given the same hash:
In case of key collision, the value will be the one most recently inserted into the hash.

```ruby
{"a" => 1, a: 2}.symbolize_keys
# The result could either be
# The result will be
# => {:a=>2}
# or
# => {:a=>1}
```

This method may be useful for example to easily accept both symbols and strings as options. For instance `ActionController::UrlRewriter` defines
Expand Down

0 comments on commit 82ee7a0

Please sign in to comment.