Skip to content

ActiveRecord ignore nullable types with null value (on update) #485

@sf-spb

Description

@sf-spb

Solution (MVCFramework.Serializer.JsonDataObjects.pas, method TMVCJsonDataObjectsSerializer.JsonDataValueToAttribute).

`jdtObject:

begin
    if (AValue.TypeInfo = System.TypeInfo(TValue)) then
      AValue := TValue.FromVariant(AJsonObject[AName].O['value'].VariantValue)
    else
    begin
      // dt: if a key is null, jsondataobjects assign it the type jdtObject
      if AJsonObject[AName].ObjectValue <> nil then
      begin
        [ ... skip ... ]
      end
      else begin
        // Nullable types
        case AValue.Kind of
          tkRecord:
            begin
              if AValue.TypeInfo = TypeInfo(NullableString) then
              begin
                AValue := TValue.From<NullableString>(Default(NullableString));
              end
              else if AValue.TypeInfo = TypeInfo(NullableTDate) then
              begin
                AValue := TValue.From<NullableTDate>(Default(NullableTDate));
              end
              else if AValue.TypeInfo = TypeInfo(NullableTDateTime) then
              begin
                AValue := TValue.From<NullableTDateTime>(Default(NullableTDateTime));
              end
              else if AValue.TypeInfo = TypeInfo(NullableTTime) then
              begin
                AValue := TValue.From<NullableTTime>(Default(NullableTTime));
              end
              else if AValue.TypeInfo = TypeInfo(NullableCurrency) then
              begin
                AValue := TValue.From<NullableCurrency>(Default(NullableCurrency));
              end
              else if AValue.TypeInfo = TypeInfo(NullableBoolean) then
              begin
                AValue := TValue.From<NullableBoolean>(Default(NullableBoolean));
              end
              else if AValue.TypeInfo = TypeInfo(NullableSingle) then
              begin
                AValue := TValue.From<NullableSingle>(Default(NullableSingle));
              end
              else if AValue.TypeInfo = TypeInfo(NullableDouble) then
              begin
                AValue := TValue.From<NullableDouble>(Default(NullableDouble));
              end
              else if AValue.TypeInfo = TypeInfo(NullableExtended) then
              begin
                AValue := TValue.From<NullableExtended>(Default(NullableExtended));
              end
              else if AValue.TypeInfo = TypeInfo(NullableInt16) then
              begin
                AValue := TValue.From<NullableInt16>(Default(NullableInt16));
              end
              else if AValue.TypeInfo = TypeInfo(NullableUInt16) then
              begin
                AValue := TValue.From<NullableUInt16>(Default(NullableUInt16));
              end
              else if AValue.TypeInfo = TypeInfo(NullableInt32) then
              begin
                AValue := TValue.From<NullableInt32>(Default(NullableInt32));
              end
              else if AValue.TypeInfo = TypeInfo(NullableUInt32) then
              begin
                AValue := TValue.From<NullableUInt32>(Default(NullableUInt32));
              end
              else if AValue.TypeInfo = TypeInfo(NullableInt64) then
              begin
                AValue := TValue.From<NullableInt64>(Default(NullableInt64));
              end
              else if AValue.TypeInfo = TypeInfo(NullableUInt64) then
              begin
                AValue := TValue.From<NullableUInt64>(Default(NullableUInt64));
              end
            end;
        end;

`

Metadata

Metadata

Assignees

Labels

acceptedIssue has been accepted and inserted in a future milestonebug

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions