parent
							
								
									812bb20c34
								
							
						
					
					
						commit
						11fdf46a9f
					
				| @ -105,7 +105,7 @@ func (db *DB) Save(value interface{}) (tx *DB) { | |||||||
| 		updateTx := tx.callbacks.Update().Execute(tx.Session(&Session{Initialized: true})) | 		updateTx := tx.callbacks.Update().Execute(tx.Session(&Session{Initialized: true})) | ||||||
| 
 | 
 | ||||||
| 		if updateTx.Error == nil && updateTx.RowsAffected == 0 && !updateTx.DryRun && !selectedUpdate { | 		if updateTx.Error == nil && updateTx.RowsAffected == 0 && !updateTx.DryRun && !selectedUpdate { | ||||||
| 			return tx.Clauses(clause.OnConflict{UpdateAll: true}).Create(value) | 			return tx.Session(&Session{SkipHooks: true}).Clauses(clause.OnConflict{UpdateAll: true}).Create(value) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return updateTx | 		return updateTx | ||||||
|  | |||||||
| @ -809,3 +809,76 @@ func TestUpdateWithDiffSchema(t *testing.T) { | |||||||
| 	AssertEqual(t, err, nil) | 	AssertEqual(t, err, nil) | ||||||
| 	AssertEqual(t, "update-diff-schema-2", user.Name) | 	AssertEqual(t, "update-diff-schema-2", user.Name) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type TokenOwner struct { | ||||||
|  | 	ID    int | ||||||
|  | 	Name  string | ||||||
|  | 	Token Token `gorm:"foreignKey:UserID"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (t *TokenOwner) BeforeSave(tx *gorm.DB) error { | ||||||
|  | 	t.Name += "_name" | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Token struct { | ||||||
|  | 	UserID  int    `gorm:"primary_key"` | ||||||
|  | 	Content string `gorm:"type:varchar(100)"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (t *Token) BeforeSave(tx *gorm.DB) error { | ||||||
|  | 	t.Content += "_encrypted" | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestSaveWithHooks(t *testing.T) { | ||||||
|  | 	DB.Migrator().DropTable(&Token{}, &TokenOwner{}) | ||||||
|  | 	DB.AutoMigrate(&Token{}, &TokenOwner{}) | ||||||
|  | 
 | ||||||
|  | 	saveTokenOwner := func(owner *TokenOwner) (*TokenOwner, error) { | ||||||
|  | 		var newOwner TokenOwner | ||||||
|  | 		if err := DB.Transaction(func(tx *gorm.DB) error { | ||||||
|  | 			if err := tx.Debug().Session(&gorm.Session{FullSaveAssociations: true}).Save(owner).Error; err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if err := tx.Preload("Token").First(&newOwner, owner.ID).Error; err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			return nil | ||||||
|  | 		}); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		return &newOwner, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	owner := TokenOwner{ | ||||||
|  | 		Name:  "user", | ||||||
|  | 		Token: Token{Content: "token"}, | ||||||
|  | 	} | ||||||
|  | 	o1, err := saveTokenOwner(&owner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Errorf("failed to save token owner, got error: %v", err) | ||||||
|  | 	} | ||||||
|  | 	if o1.Name != "user_name" { | ||||||
|  | 		t.Errorf(`owner name should be "user_name", but got: "%s"`, o1.Name) | ||||||
|  | 	} | ||||||
|  | 	if o1.Token.Content != "token_encrypted" { | ||||||
|  | 		t.Errorf(`token content should be "token_encrypted", but got: "%s"`, o1.Token.Content) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	owner = TokenOwner{ | ||||||
|  | 		ID:    owner.ID, | ||||||
|  | 		Name:  "user", | ||||||
|  | 		Token: Token{Content: "token2"}, | ||||||
|  | 	} | ||||||
|  | 	o2, err := saveTokenOwner(&owner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Errorf("failed to save token owner, got error: %v", err) | ||||||
|  | 	} | ||||||
|  | 	if o2.Name != "user_name" { | ||||||
|  | 		t.Errorf(`owner name should be "user_name", but got: "%s"`, o2.Name) | ||||||
|  | 	} | ||||||
|  | 	if o2.Token.Content != "token2_encrypted" { | ||||||
|  | 		t.Errorf(`token content should be "token2_encrypted", but got: "%s"`, o2.Token.Content) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 black-06
						black-06