Skip to content

Commit

Permalink
fix: fix issue with has-many join and pointer fields (uptrace#950)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffreydwalter committed Apr 27, 2024
1 parent b005dc2 commit a4d56da
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions model_table_has_many.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func (m *hasManyModel) Scan(src interface{}) error {

for _, f := range m.rel.JoinFields {
if f.Name == field.Name {
m.structKey = append(m.structKey, field.Value(m.strct).Interface())
m.structKey = append(m.structKey, getFieldValue(field.Value(m.strct)))
break
}
}
Expand All @@ -103,6 +103,7 @@ func (m *hasManyModel) Scan(src interface{}) error {
}

func (m *hasManyModel) parkStruct() error {

baseValues, ok := m.baseValues[internal.NewMapKey(m.structKey)]
if !ok {
return fmt.Errorf(
Expand Down Expand Up @@ -143,7 +144,24 @@ func baseValues(model TableModel, fields []*schema.Field) map[internal.MapKey][]

func modelKey(key []interface{}, strct reflect.Value, fields []*schema.Field) []interface{} {
for _, f := range fields {
key = append(key, f.Value(strct).Interface())
key = append(key, getFieldValue(strct.FieldByIndex(f.Index)))
}
return key
}

// getFieldValue extracts the value from a reflect.Value, handling pointer types appropriately.
func getFieldValue(fieldValue reflect.Value) interface{} {
var keyValue interface{}

if fieldValue.Kind() == reflect.Ptr {
if !fieldValue.IsNil() {
keyValue = fieldValue.Elem().Interface()
} else {
keyValue = nil
}
} else {
keyValue = fieldValue.Interface()
}

return keyValue
}

0 comments on commit a4d56da

Please sign in to comment.