diff --git a/CHANGELOG.md b/CHANGELOG.md index f177347b..86b3d5fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,9 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/). ### Fixed -- None +- [#1458](https://github.com/paper-trail-gem/paper_trail/pull/1416) - Fix serializing + of time/date columns using yaml serializer. Previously, these were serialized as ruby + objects which uses a lot of space. Now they are serialized into strings. ## 15.1.0 (2023-10-22) diff --git a/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb b/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb index 1371b3b5..b934e6c4 100644 --- a/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +++ b/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb @@ -44,7 +44,14 @@ def deserialize(attr, val) end def serialize(attr, val) - AttributeSerializerFactory.for(@klass, attr).serialize(val) + serialized = AttributeSerializerFactory.for(@klass, attr).serialize(val) + @klass.connection.type_cast(serialized) + case serialized + when Date, Time + @klass.connection.type_cast(serialized) + else + serialized + end end end end diff --git a/spec/paper_trail/attribute_serializers/object_attribute_spec.rb b/spec/paper_trail/attribute_serializers/object_attribute_spec.rb index 3bcc3e36..87218549 100644 --- a/spec/paper_trail/attribute_serializers/object_attribute_spec.rb +++ b/spec/paper_trail/attribute_serializers/object_attribute_spec.rb @@ -40,6 +40,26 @@ module AttributeSerializers end end end + + describe "#serialize" do + it "serializes a time object into a plain string" do + attrs = { "created_at" => Time.zone.local(2015, 7, 15, 20, 34, 0) } + described_class.new(Widget).serialize(attrs) + expect(attrs["created_at"]).not_to be_a(ActiveSupport::TimeWithZone) + expect(attrs["created_at"]).to be_a(String) + expect(attrs["created_at"]).to match(/2015/) + end + end + + describe "#deserialize" do + it "deserializes a time object correctly" do + time = 1.day.ago + attrs = { "created_at" => time } + described_class.new(Widget).serialize(attrs) + described_class.new(Widget).deserialize(attrs) + expect(attrs["created_at"].to_i).to eq(time.to_i) + end + end end end end