diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid/cidr.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid/cidr.rb index 4f3f9b5b88e81..2c2f25e7f104f 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid/cidr.rb @@ -31,7 +31,7 @@ def serialize(value) # TODO: Remove when IPAddr#== compares IPAddr#prefix. See # https://github.com/ruby/ipaddr/issues/21 def changed?(old_value, new_value, _new_value_before_type_cast) - super || old_value.prefix != new_value.prefix + super || !old_value.nil? && old_value.prefix != new_value.prefix end def cast_value(value) diff --git a/activerecord/test/cases/adapters/postgresql/cidr_test.rb b/activerecord/test/cases/adapters/postgresql/cidr_test.rb index f20958fbd2838..9cff1411e85cf 100644 --- a/activerecord/test/cases/adapters/postgresql/cidr_test.rb +++ b/activerecord/test/cases/adapters/postgresql/cidr_test.rb @@ -21,6 +21,15 @@ class CidrTest < ActiveRecord::PostgreSQLTestCase assert_equal "foo", type.serialize("foo") end + + test "changed? with nil values" do + type = OID::Cidr.new + + assert_not type.changed?(nil, nil, "") + assert type.changed?("192.168.0.0/24", nil, "") + assert type.changed?(nil, "192.168.0.0/24", "") + assert type.changed?("192.168.0.0/24", "192.168.0.0/25", "") + end end end end