Hiện tại, GORM cho MongoDB không cung cấp các giá trị chính xác trong dirtyPropertyNames
đồng ruộng. Vì vậy, bạn phải sử dụng một trường được đưa vào cấp thấp hơn trong phiên bản miền, tức là $changedProperties
.
Tuy nhiên, cũng có vấn đề với $changedProperties
rằng ngay cả khi bạn liên kết một trường có cùng giá trị, thì $changedProperties
sẽ có một mục cho nó. Vì vậy, bạn có thể chỉnh sửa nó nhiều hơn một chút như thế này để làm cho mã của bạn hoạt động:
def beforeUpdate() {
def instance = this
Map updatedFields = instance.$changedProperties
updatedFields.each { name, value ->
if (updatedFields[name] != instance[name]) {
println "Field value $name is updated"
if (name == "addresses") {
// I've not run this for a long time, just confirm the old and new addresses values and swap the assignment of below lines
List newAddresses = updatedFields[name]
List oldAddresses = instance[name]
newAddresses.each { address ->
if (!address.id) {
println "Got new address: $address.status"
} else {
Address oldAddress = oldAddresses.find { it.id == address.id }
if (!oldAddress) { // This is just an edge condition
println "Got new address: $address.status"
} else if (oldAddress.status != address.staus) {
println "$address status is updated to $address.status"
}
}
}
}
}
}
}