Merge 8492af206f1e7a4eee7c38b28fd56999f6ea68ac into 4e34a6d21b63e9a9b701a70be9759e5539bf26e9
This commit is contained in:
commit
111d5aaf64
20
callbacks.go
20
callbacks.go
@ -121,6 +121,26 @@ func (p *processor) Execute(db *DB) *DB {
|
|||||||
|
|
||||||
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
||||||
}
|
}
|
||||||
|
if (stmt.ReflectValue.Kind() == reflect.Slice || stmt.ReflectValue.Kind() == reflect.Array) &&
|
||||||
|
(stmt.ReflectValue.Len() > 0 && stmt.ReflectValue.Index(0).Kind() == reflect.Interface) {
|
||||||
|
len := stmt.ReflectValue.Len()
|
||||||
|
firstElem := stmt.ReflectValue.Index(0)
|
||||||
|
for firstElem.Kind() == reflect.Interface || firstElem.Kind() == reflect.Ptr {
|
||||||
|
firstElem = firstElem.Elem()
|
||||||
|
}
|
||||||
|
elemType := firstElem.Type()
|
||||||
|
sliceType := reflect.SliceOf(elemType)
|
||||||
|
structArrayReflectValue := reflect.MakeSlice(sliceType, 0, len)
|
||||||
|
|
||||||
|
for i := 0; i < len; i++ {
|
||||||
|
elem := stmt.ReflectValue.Index(i)
|
||||||
|
for elem.Kind() == reflect.Interface || elem.Kind() == reflect.Ptr {
|
||||||
|
elem = elem.Elem()
|
||||||
|
}
|
||||||
|
structArrayReflectValue = reflect.Append(structArrayReflectValue, elem)
|
||||||
|
}
|
||||||
|
stmt.ReflectValue = structArrayReflectValue
|
||||||
|
}
|
||||||
if !stmt.ReflectValue.IsValid() {
|
if !stmt.ReflectValue.IsValid() {
|
||||||
db.AddError(ErrInvalidValue)
|
db.AddError(ErrInvalidValue)
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,14 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
modelType = modelType.Elem()
|
modelType = modelType.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if modelType.Kind() == reflect.Interface {
|
||||||
|
if value.Len() > 0 {
|
||||||
|
modelType = reflect.Indirect(value.Index(0)).Elem().Type()
|
||||||
|
}
|
||||||
|
if modelType.Kind() == reflect.Ptr {
|
||||||
|
modelType = modelType.Elem()
|
||||||
|
}
|
||||||
|
}
|
||||||
if modelType.Kind() != reflect.Struct {
|
if modelType.Kind() != reflect.Struct {
|
||||||
if modelType.Kind() == reflect.Interface {
|
if modelType.Kind() == reflect.Interface {
|
||||||
modelType = reflect.Indirect(reflect.ValueOf(dest)).Elem().Type()
|
modelType = reflect.Indirect(reflect.ValueOf(dest)).Elem().Type()
|
||||||
|
@ -808,3 +808,15 @@ func TestCreateFromMapWithTable(t *testing.T) {
|
|||||||
t.Errorf("failed to create data from map with table, @id != id")
|
t.Errorf("failed to create data from map with table, @id != id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCreateWithInterfaceArrayType(t *testing.T) {
|
||||||
|
user := *GetUser("create", Config{})
|
||||||
|
type UserInterface interface{}
|
||||||
|
var userInterface UserInterface = &user
|
||||||
|
|
||||||
|
if results := DB.Create([]UserInterface{userInterface}); results.Error != nil {
|
||||||
|
t.Fatalf("errors happened when create: %v", results.Error)
|
||||||
|
} else if results.RowsAffected != 1 {
|
||||||
|
t.Fatalf("rows affected expects: %v, got %v", 1, results.RowsAffected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user