forked from mirror/gorm
Fix FullSaveAssociations, close #4874
This commit is contained in:
parent
9d5f315b6d
commit
e1b4c066a8
|
@ -317,6 +317,9 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
|
||||||
}
|
}
|
||||||
|
|
||||||
onConflict.DoUpdates = append(onConflict.DoUpdates, clause.AssignmentColumns(columns)...)
|
onConflict.DoUpdates = append(onConflict.DoUpdates, clause.AssignmentColumns(columns)...)
|
||||||
|
if len(onConflict.DoUpdates) == 0 {
|
||||||
|
onConflict.DoNothing = true
|
||||||
|
}
|
||||||
|
|
||||||
// use primary fields as default OnConflict columns
|
// use primary fields as default OnConflict columns
|
||||||
if len(onConflict.Columns) == 0 {
|
if len(onConflict.Columns) == 0 {
|
||||||
|
|
|
@ -24,9 +24,9 @@ func (set Set) Build(builder Builder) {
|
||||||
builder.AddVar(builder, assignment.Value)
|
builder.AddVar(builder, assignment.Value)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
builder.WriteQuoted(PrimaryColumn)
|
builder.WriteQuoted(Column{Name: PrimaryKey})
|
||||||
builder.WriteByte('=')
|
builder.WriteByte('=')
|
||||||
builder.WriteQuoted(PrimaryColumn)
|
builder.WriteQuoted(Column{Name: PrimaryKey})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,3 +176,31 @@ func TestForeignKeyConstraintsBelongsTo(t *testing.T) {
|
||||||
t.Fatalf("Should not find deleted profile")
|
t.Fatalf("Should not find deleted profile")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFullSaveAssociations(t *testing.T) {
|
||||||
|
err := DB.
|
||||||
|
Session(&gorm.Session{FullSaveAssociations: true}).
|
||||||
|
Create(&Coupon{
|
||||||
|
ID: "full-save-association-coupon1",
|
||||||
|
AppliesToProduct: []*CouponProduct{
|
||||||
|
{
|
||||||
|
CouponId: "full-save-association-coupon1",
|
||||||
|
ProductId: "full-save-association-product1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AmountOff: 10,
|
||||||
|
PercentOff: 0.0,
|
||||||
|
}).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed, got error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if DB.First(&Coupon{}, "id = ?", "full-save-association-coupon1").Error != nil {
|
||||||
|
t.Errorf("Failed to query saved coupon")
|
||||||
|
}
|
||||||
|
|
||||||
|
if DB.First(&CouponProduct{}, "coupon_id = ? AND product_id = ?", "full-save-association-coupon1", "full-save-association-product1").Error != nil {
|
||||||
|
t.Errorf("Failed to query saved association")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
|
github.com/jackc/pgtype v1.9.1 // indirect
|
||||||
github.com/jackc/pgx/v4 v4.14.0 // indirect
|
github.com/jackc/pgx/v4 v4.14.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.3
|
github.com/jinzhu/now v1.1.3
|
||||||
github.com/lib/pq v1.10.4
|
github.com/lib/pq v1.10.4
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMigrate(t *testing.T) {
|
func TestMigrate(t *testing.T) {
|
||||||
allModels := []interface{}{&User{}, &Account{}, &Pet{}, &Company{}, &Toy{}, &Language{}}
|
allModels := []interface{}{&User{}, &Account{}, &Pet{}, &Company{}, &Toy{}, &Language{}, &Coupon{}, &CouponProduct{}}
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
rand.Shuffle(len(allModels), func(i, j int) { allModels[i], allModels[j] = allModels[j], allModels[i] })
|
rand.Shuffle(len(allModels), func(i, j int) { allModels[i], allModels[j] = allModels[j], allModels[i] })
|
||||||
DB.Migrator().DropTable("user_speaks", "user_friends", "ccc")
|
DB.Migrator().DropTable("user_speaks", "user_friends", "ccc")
|
||||||
|
|
|
@ -60,3 +60,15 @@ type Language struct {
|
||||||
Code string `gorm:"primarykey"`
|
Code string `gorm:"primarykey"`
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Coupon struct {
|
||||||
|
ID string `gorm:"primarykey; size:255"`
|
||||||
|
AppliesToProduct []*CouponProduct `gorm:"foreignKey:CouponId;constraint:OnDelete:CASCADE"`
|
||||||
|
AmountOff uint32 `gorm:"amount_off"`
|
||||||
|
PercentOff float32 `gorm:"percent_off"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CouponProduct struct {
|
||||||
|
CouponId string `gorm:"primarykey; size:255"`
|
||||||
|
ProductId string `gorm:"primarykey; size:255"`
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue