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
	 KEHyeon
						KEHyeon