【问题标题】:Simplest way to detect if any model value has changed检测任何模型值是否已更改的最简单方法
【发布时间】:2020-03-07 08:53:54
【问题描述】:

我使用 gorm 作为 Golang ORM。我需要检测是否有任何模型字段发生更改以触发第三方 API 服务的更新。

我尝试使用 If 语句测试每个字段,但是当模型有很多字段时,它会变得很难看。

var person Person

db.Where("id = ?", id).First(&person)

if person.Name != body.Person.Name || person.Age != body.Person.Age {
  // Trigger API update
}

db.Save(&person)

有没有简单的方法来实现这一点?

【问题讨论】:

    标签: go orm go-gorm


    【解决方案1】:

    我不知道这是否是最简单的方法,it is probably not idiomatic,但你可以通过反射来完成。以下函数使用reflect Package 比较两个Person 结构以查看它们的每个字段的值是否相同,跳过Model 结构(其内部变化独立于Person 表示的数据元素)。

    func (this Person) Equals(that Person) bool {
        vThis := reflect.ValueOf(this)
        vThat := reflect.ValueOf(that)
        for i := 0; i < vThis.NumField(); i++ {
            if vThis.Field(i) != vThis.FieldByName("Model") {
                if vThis.Field(i).Interface() != vThat.Field(i).Interface() {
                    return false
                }
            }       
        }
        return true
    }
    

    你可以在你的代码 sn-p 中使用它,然后如下:

    if !person.Equals(body.Person) {
      // Trigger API update
    }
    

    请注意,我是新手,所以我可能会在“正确”代码方面将您引入歧途。但这确实有效。

    【讨论】:

      【解决方案2】:

      GORM 确实通过 'Changed' 方法提供了这样的功能,可以在更新前挂钩中使用。如果该字段已更改,则返回。

      https://gorm.io/docs/update.html#Check-Field-has-changed

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2013-07-20
        • 1970-01-01
        相关资源
        最近更新 更多