fix: replace associations with custom pk
This commit is contained in:
		
							parent
							
								
									11c4331058
								
							
						
					
					
						commit
						0f92628e85
					
				| @ -178,7 +178,8 @@ func SaveAfterAssociations(create bool) func(db *gorm.DB) { | ||||
| 							} else if ref.PrimaryValue != "" { | ||||
| 								db.AddError(ref.ForeignKey.Set(db.Statement.Context, f, ref.PrimaryValue)) | ||||
| 							} | ||||
| 							assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName) | ||||
| 
 | ||||
| 							assignmentColumns = append(assignmentColumns, getAssignmentColumnsForForeignKey(ref.ForeignKey)...) | ||||
| 						} | ||||
| 
 | ||||
| 						saveAssociations(db, rel, f, selectColumns, restricted, assignmentColumns) | ||||
| @ -431,6 +432,33 @@ func saveAssociations(db *gorm.DB, rel *schema.Relationship, rValues reflect.Val | ||||
| 	return db.AddError(tx.Create(values).Error) | ||||
| } | ||||
| 
 | ||||
| func getAssignmentColumnsForForeignKey(foreignKey *schema.Field) []string { | ||||
| 	var assignmentColumns []string | ||||
| 
 | ||||
| 	if foreignKey.Schema == nil { | ||||
| 		return assignmentColumns | ||||
| 	} | ||||
| 
 | ||||
| 	if !foreignKey.PrimaryKey { | ||||
| 		assignmentColumns = append(assignmentColumns, foreignKey.DBName) | ||||
| 		return assignmentColumns | ||||
| 	} | ||||
| 
 | ||||
| 	for _, field := range foreignKey.Schema.Fields { | ||||
| 		if field.PrimaryKey { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		if field.DBName == "" { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		assignmentColumns = append(assignmentColumns, field.DBName) | ||||
| 	} | ||||
| 
 | ||||
| 	return assignmentColumns | ||||
| } | ||||
| 
 | ||||
| // check association values has been saved
 | ||||
| // if values kind is Struct, check it has been saved
 | ||||
| // if values kind is Slice/Array, check all items have been saved
 | ||||
|  | ||||
| @ -256,14 +256,44 @@ func TestPolymorphicHasOneAssociationForSlice(t *testing.T) { | ||||
| 	AssertAssociationCount(t, pets, "Toy", 0, "After Clear") | ||||
| } | ||||
| 
 | ||||
| func TestHasOneAssociationReplaceWithNonValidValue(t *testing.T) { | ||||
| 	user := User{Name: "jinzhu", Account: Account{Number: "1"}} | ||||
| func TestReplaceHasOneAssociationWithCustomPK(t *testing.T) { | ||||
| 	if DB.Dialector.Name() == "sqlite" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Create(&user).Error; err != nil { | ||||
| 	DB.Migrator().DropTable(&Owner{}) | ||||
| 	DB.Migrator().DropTable(&CreditCard{}) | ||||
| 
 | ||||
| 	DB.AutoMigrate(&CreditCard{}) | ||||
| 	DB.AutoMigrate(&Owner{}) | ||||
| 
 | ||||
| 	owner := Owner{ | ||||
| 		Name: "jinzhu", | ||||
| 		CreditCard: CreditCard{ | ||||
| 			Number:   "123", | ||||
| 			UserName: "jinzhu", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Create(&owner).Error; err != nil { | ||||
| 		t.Fatalf("errors happened when create: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Model(&user).Association("Languages").Replace(Account{Number: "2"}); err == nil { | ||||
| 		t.Error("expected association error to be not nil") | ||||
| 	wantNumber := "456" | ||||
| 
 | ||||
| 	if err := DB.Model(&owner).Association("CreditCard").Replace(&CreditCard{ | ||||
| 		Number:   wantNumber, | ||||
| 		UserName: "jinzhu", | ||||
| 	}); err != nil { | ||||
| 		t.Fatalf("errors happened when create: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	var result Owner | ||||
| 	if err := DB.Preload("CreditCard").First(&result, owner.ID).Error; err != nil { | ||||
| 		t.Fatalf("errors happened when getting credit card: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if result.CreditCard.Number != wantNumber { | ||||
| 		t.Fatal("wrong credit card number") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -102,3 +102,14 @@ type Child struct { | ||||
| 	ParentID *uint | ||||
| 	Parent   *Parent | ||||
| } | ||||
| 
 | ||||
| type Owner struct { | ||||
| 	gorm.Model | ||||
| 	Name       string     `gorm:"index"` | ||||
| 	CreditCard CreditCard `gorm:"foreignKey:OwnerName;references:name"` | ||||
| } | ||||
| 
 | ||||
| type CreditCard struct { | ||||
| 	Number   string | ||||
| 	UserName string `gorm:"primaryKey;unique;size:255"` | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 sgsv
						sgsv