MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Impossible d'obtenir les valeurs des propriétés dirtyPropertyNames pour les champs d'association dans les grails

Actuellement, GORM pour MongoDB ne donne pas de valeurs correctes dans le dirtyPropertyNames champ. Vous devez donc utiliser un autre champ injecté de niveau inférieur dans l'instance de domaine, c'est-à-dire $changedProperties .

Mais, il y a aussi un problème avec le $changedProperties que même si vous liez un champ avec la même valeur, le $changedProperties aura une entrée pour cela. Vous pouvez donc le modifier un peu plus comme ceci pour que votre code fonctionne :

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"
                        }
                    }
                }
            }
        }
    }
}