mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #15432 from sgrif/sg-coder-type-casting
Don't change values in `@raw_attributes` during serialization
This commit is contained in:
commit
260c384bdb
4 changed files with 14 additions and 23 deletions
|
@ -289,7 +289,7 @@ module ActiveRecord
|
||||||
|
|
||||||
# Placeholder so it can be overriden when needed by serialization
|
# Placeholder so it can be overriden when needed by serialization
|
||||||
def attributes_for_coder # :nodoc:
|
def attributes_for_coder # :nodoc:
|
||||||
attributes
|
attributes_before_type_cast
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns an <tt>#inspect</tt>-like string for the value of the
|
# Returns an <tt>#inspect</tt>-like string for the value of the
|
||||||
|
|
|
@ -138,7 +138,7 @@ module ActiveRecord
|
||||||
attrs[name] = if self.class.serialized_attributes.include?(name)
|
attrs[name] = if self.class.serialized_attributes.include?(name)
|
||||||
@raw_attributes[name].serialized_value
|
@raw_attributes[name].serialized_value
|
||||||
else
|
else
|
||||||
read_attribute(name)
|
read_attribute_before_type_cast(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -183,20 +183,6 @@ class StoreTest < ActiveRecord::TestCase
|
||||||
assert_equal({}, @john.params)
|
assert_equal({}, @john.params)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "attributes_for_coder should return stored fields already serialized" do
|
|
||||||
attributes = {
|
|
||||||
"id" => @john.id,
|
|
||||||
"name"=> @john.name,
|
|
||||||
"settings" => "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\ncolor: black\n",
|
|
||||||
"preferences" => "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nremember_login: true\n",
|
|
||||||
"json_data" => "{\"height\":\"tall\"}", "json_data_empty"=>"{\"is_a_good_guy\":true}",
|
|
||||||
"params" => "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess {}\n",
|
|
||||||
"account_id"=> @john.account_id
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_equal attributes, @john.attributes_for_coder
|
|
||||||
end
|
|
||||||
|
|
||||||
test "dump, load and dump again a model" do
|
test "dump, load and dump again a model" do
|
||||||
dumped = YAML.dump(@john)
|
dumped = YAML.dump(@john)
|
||||||
loaded = YAML.load(dumped)
|
loaded = YAML.load(dumped)
|
||||||
|
|
|
@ -23,13 +23,6 @@ class YamlSerializationTest < ActiveRecord::TestCase
|
||||||
assert_equal({:omg=>:lol}, YAML.load(YAML.dump(topic)).content)
|
assert_equal({:omg=>:lol}, YAML.load(YAML.dump(topic)).content)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_encode_with_coder
|
|
||||||
topic = Topic.first
|
|
||||||
coder = {}
|
|
||||||
topic.encode_with coder
|
|
||||||
assert_equal({'attributes' => topic.attributes}, coder)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_psych_roundtrip
|
def test_psych_roundtrip
|
||||||
topic = Topic.first
|
topic = Topic.first
|
||||||
assert topic
|
assert topic
|
||||||
|
@ -47,4 +40,16 @@ class YamlSerializationTest < ActiveRecord::TestCase
|
||||||
def test_active_record_relation_serialization
|
def test_active_record_relation_serialization
|
||||||
[Topic.all].to_yaml
|
[Topic.all].to_yaml
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_raw_types_are_not_changed_on_round_trip
|
||||||
|
topic = Topic.new(parent_id: "123")
|
||||||
|
assert_equal "123", topic.parent_id_before_type_cast
|
||||||
|
assert_equal "123", YAML.load(YAML.dump(topic)).parent_id_before_type_cast
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cast_types_are_not_changed_on_round_trip
|
||||||
|
topic = Topic.new(parent_id: "123")
|
||||||
|
assert_equal 123, topic.parent_id
|
||||||
|
assert_equal 123, YAML.load(YAML.dump(topic)).parent_id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue