Fix association replace non-addressable panic

This commit is contained in:
sgsv 2024-05-09 16:10:24 +02:00
parent 5e599a07ec
commit 17517b05ec
2 changed files with 23 additions and 0 deletions

View File

@ -384,6 +384,11 @@ func (association *Association) saveAssociation(clear bool, values ...interface{
)
appendToRelations := func(source, rv reflect.Value, clear bool) {
if !rv.CanAddr() {
association.Error = ErrInvalidValue
return
}
switch association.Relationship.Type {
case schema.HasOne, schema.BelongsTo:
switch rv.Kind() {
@ -510,6 +515,9 @@ func (association *Association) saveAssociation(clear bool, values ...interface{
for i := 0; i < reflectValue.Len(); i++ {
appendToRelations(reflectValue.Index(i), reflect.Indirect(reflect.ValueOf(values[i])), clear)
if association.Error != nil {
return
}
// TODO support save slice data, sql with case?
association.Error = associationDB.Updates(reflectValue.Index(i).Addr().Interface()).Error
@ -531,6 +539,9 @@ func (association *Association) saveAssociation(clear bool, values ...interface{
for idx, value := range values {
rv := reflect.Indirect(reflect.ValueOf(value))
appendToRelations(reflectValue, rv, clear && idx == 0)
if association.Error != nil {
return
}
}
if len(values) > 0 {

View File

@ -554,3 +554,15 @@ func TestHasManyAssociationUnscoped(t *testing.T) {
t.Errorf("expected %d contents, got %d", 0, len(contents))
}
}
func TestHasManyAssociationReplaceWithNonValidValue(t *testing.T) {
user := User{Name: "jinzhu", Languages: []Language{{Name: "EN"}}}
if err := DB.Create(&user).Error; err != nil {
t.Fatalf("errors happened when create: %v", err)
}
if err := DB.Model(&user).Association("Languages").Replace(Language{Name: "DE"}, Language{Name: "FR"}); err == nil {
t.Error("expected association error to be not nil")
}
}