2010-11-02 3 views
8

Je suis un débutant dans les grails et groovy. J'ai une classe de domaine de projet avec des dates de début et de fin. Je souhaite placer une contrainte spécifiant que la date de fin doit être supérieure à la date de début (et qu'un autre objet enfant du projet doit avoir ses dates startdate et enddate avec les dates du projet parent). Est-ce possible avec la contrainte min ou dois-je le mettre ailleurs? Une contrainte unique permet de relier deux propriétés de cette façon, en espérant que les contraintes min/max le permettent. J'ai essayéGrails min contrainte pour la validation de la date

startDate(blank:false) 
endDate(blank:false, min:'startDate') 

Il renvoie une erreur indiquant que le startDate de propriété ne sont pas disponibles sur le projet

+0

Ma réponse suppose que 'endDate' est défini comme' java.util.Date'. Est-ce correct? Si non, veuillez préciser ce que c'est et je mettrai à jour ma réponse en conséquence. –

+0

Oui c'est une date régulière. Était l'espoir de la contrainte min s'appliquerait à cela aussi .. Merci pour la réponse :) Ainsi, min s'applique uniquement aux entiers, non? –

+0

Eh bien, 'min' peut très bien s'appliquer aux valeurs' Date'. Cependant, je ne crois pas que vous puissiez utiliser une valeur dynamique (c'est-à-dire une autre valeur de champ) dans votre définition de contrainte pour 'min' car' contraintes' est une fermeture statique. Vous pourriez faire 'endDate (min: new Date())', cependant, sans problèmes. –

Répondre

13

Essayez d'utiliser un validateur personnalisé:

static constraints = { 
    endDate(validator: { val, obj -> 
     val?.after(obj.startDate) 
    }) 
} 

val est la valeur du champ et obj est une référence à l'objet en cours de validation. La fermeture peut contenir toute la logique dont vous avez besoin, vous pouvez donc étendre votre validation de la manière que vous décrivez dans votre question (en accédant aux objets enfants auxquels vous faites référence en utilisant obj).

Le validateur personnalisé est assez flexible. Jetez un oeil à the documentation. Idéalement, vous voudrez retourner un message personnalisé; comment faire cela peut également être trouvé dans les documents liés ci-dessus.