Add partial support for many_to_many

This commit is contained in:
Ian Tan 2017-11-22 15:23:02 +08:00
parent d28ab5ae89
commit 8ae27d7ec7
2 changed files with 33 additions and 5 deletions

View File

@ -49,8 +49,8 @@ func getRowForFields(fields []*Field) []driver.Value {
if driver.IsValue(concreteVal) { if driver.IsValue(concreteVal) {
values = append(values, concreteVal) values = append(values, concreteVal)
} else if value.Kind() == reflect.Int || value.Kind() == reflect.Int8 || value.Kind() == reflect.Int16 || value.Kind() == reflect.Int64 { } else if num, err := driver.DefaultParameterConverter.ConvertValue(concreteVal); err == nil {
values = append(values, value.Int()) values = append(values, num)
} else if valuer, ok := concreteVal.(driver.Valuer); ok { } else if valuer, ok := concreteVal.(driver.Valuer); ok {
if convertedValue, err := valuer.Value(); err == nil { if convertedValue, err := valuer.Value(); err == nil {
values = append(values, convertedValue) values = append(values, convertedValue)
@ -69,13 +69,15 @@ func getRelationRows(rVal reflect.Value, fieldName string, relation *Relationshi
) )
switch relation.Kind { switch relation.Kind {
case "has_many": case "has_many", "many_to_many":
elem := rVal.Type().Elem() elem := rVal.Type().Elem()
scope := &Scope{Value: reflect.New(elem).Interface()} scope := &Scope{Value: reflect.New(elem).Interface()}
for _, field := range scope.GetModelStruct().StructFields { for _, field := range scope.GetModelStruct().StructFields {
if field.IsNormal {
columns = append(columns, field.DBName) columns = append(columns, field.DBName)
} }
}
rows = sqlmock.NewRows(columns) rows = sqlmock.NewRows(columns)

View File

@ -119,7 +119,7 @@ func TestFindSlice(t *testing.T) {
} }
} }
func TestMockPreload(t *testing.T) { func TestMockPreloadHasMany(t *testing.T) {
db, expect, err := gorm.NewDefaultExpecter() db, expect, err := gorm.NewDefaultExpecter()
defer func() { defer func() {
db.Close() db.Close()
@ -144,3 +144,29 @@ func TestMockPreload(t *testing.T) {
t.Error("In and out are not equal") t.Error("In and out are not equal")
} }
} }
func TestMockPreloadMany2Many(t *testing.T) {
db, expect, err := gorm.NewDefaultExpecter()
defer func() {
db.Close()
}()
if err != nil {
t.Fatal(err)
}
in := User{Id: 1}
languages := []Language{Language{Name: "ZH"}, Language{Name: "EN"}}
out := User{Id: 1, Languages: languages}
expect.Preload("Languages").Find(&in).Returns(out)
db.Preload("Languages").Find(&in)
if err := expect.AssertExpectations(); err != nil {
t.Error(err)
}
// if !reflect.DeepEqual(in, out) {
// t.Error("In and out are not equal")
// }
}