Merge 5b88384bd06b3bb9e2273c8fd4d83aa8f025f7a8 into 1ad419004fa8ae90145d4e3ff4fcb2629996b54b
This commit is contained in:
commit
061d048bee
@ -16,7 +16,7 @@ func CommitOrRollbackTransaction(scope *Scope) {
|
|||||||
|
|
||||||
func SaveBeforeAssociations(scope *Scope) {
|
func SaveBeforeAssociations(scope *Scope) {
|
||||||
for _, field := range scope.Fields() {
|
for _, field := range scope.Fields() {
|
||||||
if !field.IsBlank && !field.IsIgnored {
|
if field.AlwaysUpdate || !field.IsBlank && !field.IsIgnored {
|
||||||
relationship := field.Relationship
|
relationship := field.Relationship
|
||||||
if relationship != nil && relationship.Kind == "belongs_to" {
|
if relationship != nil && relationship.Kind == "belongs_to" {
|
||||||
value := field.Field
|
value := field.Field
|
||||||
@ -42,7 +42,7 @@ func SaveBeforeAssociations(scope *Scope) {
|
|||||||
|
|
||||||
func SaveAfterAssociations(scope *Scope) {
|
func SaveAfterAssociations(scope *Scope) {
|
||||||
for _, field := range scope.Fields() {
|
for _, field := range scope.Fields() {
|
||||||
if !field.IsBlank && !field.IsIgnored {
|
if field.AlwaysUpdate || !field.IsBlank && !field.IsIgnored {
|
||||||
relationship := field.Relationship
|
relationship := field.Relationship
|
||||||
if relationship != nil &&
|
if relationship != nil &&
|
||||||
(relationship.Kind == "has_one" || relationship.Kind == "has_many" || relationship.Kind == "many_to_many") {
|
(relationship.Kind == "has_one" || relationship.Kind == "has_many" || relationship.Kind == "many_to_many") {
|
||||||
|
1
field.go
1
field.go
@ -23,6 +23,7 @@ type Field struct {
|
|||||||
IsBlank bool
|
IsBlank bool
|
||||||
IsIgnored bool
|
IsIgnored bool
|
||||||
IsPrimaryKey bool
|
IsPrimaryKey bool
|
||||||
|
AlwaysUpdate bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (field *Field) IsScanner() bool {
|
func (field *Field) IsScanner() bool {
|
||||||
|
4
scope.go
4
scope.go
@ -304,7 +304,9 @@ func (scope *Scope) fieldFromStruct(fieldStruct reflect.StructField, withRelatio
|
|||||||
if fieldStruct.Tag.Get(tagIdentifier) == "-" {
|
if fieldStruct.Tag.Get(tagIdentifier) == "-" {
|
||||||
field.IsIgnored = true
|
field.IsIgnored = true
|
||||||
}
|
}
|
||||||
|
if _, ok := settings["UPDATE"]; ok {
|
||||||
|
field.AlwaysUpdate = true
|
||||||
|
}
|
||||||
if !field.IsIgnored {
|
if !field.IsIgnored {
|
||||||
// parse association
|
// parse association
|
||||||
if !indirectValue.IsValid() {
|
if !indirectValue.IsValid() {
|
||||||
|
@ -158,3 +158,55 @@ func TestUpdateColumn(t *testing.T) {
|
|||||||
t.Errorf("updatedAt should not be updated with update column")
|
t.Errorf("updatedAt should not be updated with update column")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAlwaysUpdate(t *testing.T) {
|
||||||
|
type Always struct {
|
||||||
|
Id int64
|
||||||
|
Name string
|
||||||
|
Code string
|
||||||
|
Price int64 `gorm:"update"`
|
||||||
|
}
|
||||||
|
|
||||||
|
DB.DropTable(&Always{})
|
||||||
|
DB.CreateTable(&Always{})
|
||||||
|
|
||||||
|
obj1 := Always{Name: "obj1", Code: "code_1", Price: 10}
|
||||||
|
obj2 := Always{Name: "obj2", Code: "code_2", Price: 20}
|
||||||
|
|
||||||
|
// save initial
|
||||||
|
DB.Save(&obj1).Save(&obj2).UpdateColumn(map[string]interface{}{"code": "columnUpdate2"})
|
||||||
|
|
||||||
|
// fetch and verify
|
||||||
|
var obj3, obj4 Always
|
||||||
|
DB.First(&obj3, obj1.Id)
|
||||||
|
if obj3.Code != "code_1" || obj3.Price != 10 {
|
||||||
|
t.Errorf("obj1 was not saved correctly: expected: %#v got: %#v", obj1, obj3)
|
||||||
|
}
|
||||||
|
DB.First(&obj4, obj2.Id)
|
||||||
|
if obj4.Code != "columnUpdate2" || obj4.Price != 20 {
|
||||||
|
t.Errorf("obj2 was not saved correctly: expected: %#v got: %#v", obj2, obj4)
|
||||||
|
}
|
||||||
|
|
||||||
|
// now update via struct price should change to zero
|
||||||
|
obj5 := Always{Name: "obj2update", Code: "code_2"}
|
||||||
|
DB.Model(obj5).Updates(obj5)
|
||||||
|
|
||||||
|
var obj6 Always
|
||||||
|
DB.First(&obj6, obj2.Id)
|
||||||
|
if obj6.Code != "code_2" || obj6.Name != "obj2update" || obj6.Price != 0 {
|
||||||
|
t.Errorf("obj2 was not saved correctly: got: %#v", obj6)
|
||||||
|
}
|
||||||
|
|
||||||
|
var res []Always
|
||||||
|
DB.Find(&res)
|
||||||
|
if len(res) != 2 {
|
||||||
|
t.Error("Should have 2 objects")
|
||||||
|
}
|
||||||
|
|
||||||
|
// test where clause
|
||||||
|
var res1 []Always
|
||||||
|
DB.Where(Always{}).Find(&res1)
|
||||||
|
if len(res1) != 2 {
|
||||||
|
t.Error("Where() Should have 2 returned objects")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -65,7 +65,7 @@ func convertInterfaceToMap(values interface{}) map[string]interface{} {
|
|||||||
default:
|
default:
|
||||||
scope := Scope{Value: values}
|
scope := Scope{Value: values}
|
||||||
for _, field := range scope.Fields() {
|
for _, field := range scope.Fields() {
|
||||||
if !field.IsBlank {
|
if field.AlwaysUpdate || !field.IsBlank {
|
||||||
attrs[field.DBName] = field.Field.Interface()
|
attrs[field.DBName] = field.Field.Interface()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user