Allow to skip associations when creating join table for many2many, close #3605

This commit is contained in:
Jinzhu 2020-11-17 20:24:08 +08:00
parent 694e42d6a1
commit 50df9da6a1
2 changed files with 25 additions and 1 deletions

View File

@ -291,7 +291,9 @@ func SaveAfterAssociations(db *gorm.DB) {
} }
if elems.Len() > 0 { if elems.Len() > 0 {
db.AddError(db.Session(&gorm.Session{NewDB: true}).Clauses(onConflictOption(db.Statement, rel.FieldSchema, nil)).Create(elems.Interface()).Error) if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
db.AddError(db.Session(&gorm.Session{NewDB: true}).Clauses(onConflictOption(db.Statement, rel.FieldSchema, nil)).Create(elems.Interface()).Error)
}
for i := 0; i < elems.Len(); i++ { for i := 0; i < elems.Len(); i++ {
appendToJoins(objs[i], elems.Index(i)) appendToJoins(objs[i], elems.Index(i))

View File

@ -93,6 +93,28 @@ func TestMany2ManyAssociation(t *testing.T) {
AssertAssociationCount(t, user2, "Languages", 0, "after clear") AssertAssociationCount(t, user2, "Languages", 0, "after clear")
} }
func TestMany2ManyOmitAssociations(t *testing.T) {
var user = *GetUser("many2many_omit_associations", Config{Languages: 2})
if err := DB.Omit("Languages.*").Create(&user).Error; err == nil {
t.Fatalf("should raise error when create users without languages reference")
}
if err := DB.Create(&user.Languages).Error; err != nil {
t.Fatalf("no error should happen when create languages, but got %v", err)
}
if err := DB.Omit("Languages.*").Create(&user).Error; err != nil {
t.Fatalf("no error should happen when create user when languages exists, but got %v", err)
}
// Find
var languages []Language
if DB.Model(&user).Association("Languages").Find(&languages); len(languages) != 2 {
t.Errorf("languages count should be %v, but got %v", 2, len(languages))
}
}
func TestMany2ManyAssociationForSlice(t *testing.T) { func TestMany2ManyAssociationForSlice(t *testing.T) {
var users = []User{ var users = []User{
*GetUser("slice-many2many-1", Config{Languages: 2}), *GetUser("slice-many2many-1", Config{Languages: 2}),