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() | ||||
| 		} | ||||
| 		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() { | ||||
| 			db.AddError(ErrInvalidValue) | ||||
| 		} | ||||
|  | ||||
| @ -135,6 +135,14 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam | ||||
| 		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.Interface { | ||||
| 			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") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 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
	 KEHyeon
						KEHyeon