Refact fix invalid zero value for Preload

This commit is contained in:
Jinzhu 2015-12-16 10:40:57 +08:00
parent 861c477a33
commit c6a22c5096
1 changed files with 11 additions and 19 deletions

View File

@ -9,14 +9,11 @@ import (
) )
func getRealValue(value reflect.Value, columns []string) (results []interface{}) { func getRealValue(value reflect.Value, columns []string) (results []interface{}) {
for _, column := range columns { // If value is a nil pointer, Indirect returns a zero Value!
pointedValue := reflect.Indirect(value)
// If v is a nil pointer, Indirect returns a zero Value!
// Therefor we need to check for a zero value, // Therefor we need to check for a zero value,
// as FieldByName could panic // as FieldByName could panic
if !pointedValue.IsValid() { if pointedValue := reflect.Indirect(value); pointedValue.IsValid() {
continue for _, column := range columns {
}
if pointedValue.FieldByName(column).IsValid() { if pointedValue.FieldByName(column).IsValid() {
result := pointedValue.FieldByName(column).Interface() result := pointedValue.FieldByName(column).Interface()
if r, ok := result.(driver.Valuer); ok { if r, ok := result.(driver.Valuer); ok {
@ -25,6 +22,7 @@ func getRealValue(value reflect.Value, columns []string) (results []interface{})
results = append(results, result) results = append(results, result)
} }
} }
}
return return
} }
@ -297,12 +295,6 @@ func (scope *Scope) handleManyToManyPreload(field *Field, conditions []interface
} }
} }
} else { } else {
// If v is a nil pointer, Indirect returns a zero Value!
// Therefor we need to check for a zero value,
// as FieldByName could panic
if !scope.IndirectValue().IsValid() {
return
}
object := scope.IndirectValue() object := scope.IndirectValue()
source := getRealValue(object, associationForeignStructFieldNames) source := getRealValue(object, associationForeignStructFieldNames)
field := object.FieldByName(field.Name) field := object.FieldByName(field.Name)