diff --git a/main_test.go b/main_test.go index c5e19c593..e8633b2df 100644 --- a/main_test.go +++ b/main_test.go @@ -13,6 +13,7 @@ import ( "os" "path/filepath" "reflect" + "sort" "strconv" "strings" "sync" @@ -843,6 +844,11 @@ func TestJoinsWithSelect(t *testing.T) { var results []result DB.Table("users").Select("name, emails.email").Joins("left join emails on emails.user_id = users.id").Where("name = ?", "joins_with_select").Scan(&results) + + sort.Slice(results, func(i, j int) bool { + return strings.Compare(results[i].Email, results[j].Email) < 0 + }) + if len(results) != 2 || results[0].Email != "join1@example.com" || results[1].Email != "join2@example.com" { t.Errorf("Should find all two emails with Join select") } diff --git a/scope.go b/scope.go index d82cadbc8..3749db044 100644 --- a/scope.go +++ b/scope.go @@ -913,21 +913,25 @@ func (scope *Scope) updatedAttrsWithValues(value interface{}) (results map[strin results = map[string]interface{}{} for key, value := range convertInterfaceToMap(value, true, scope.db) { - if field, ok := scope.FieldByName(key); ok && scope.changeableField(field) { - if _, ok := value.(*SqlExpr); ok { - hasUpdate = true - results[field.DBName] = value - } else { - err := field.Set(value) - if field.IsNormal && !field.IsIgnored { + if field, ok := scope.FieldByName(key); ok { + if scope.changeableField(field) { + if _, ok := value.(*SqlExpr); ok { hasUpdate = true - if err == ErrUnaddressable { - results[field.DBName] = value - } else { - results[field.DBName] = field.Field.Interface() + results[field.DBName] = value + } else { + err := field.Set(value) + if field.IsNormal && !field.IsIgnored { + hasUpdate = true + if err == ErrUnaddressable { + results[field.DBName] = value + } else { + results[field.DBName] = field.Field.Interface() + } } } } + } else { + results[key] = value } } return