2011-09-27 1 views
0

Supposons que j'ai une classe de domaine branch qui a plusieurs membres:Grails: champs dérivés dans les classes de domaine

… 
static hasMany = [ members:Member ]; 
… 

Supposons maintenant que je veux avoir le nombre de membres de cette branche facilement disponibles, pour l'afficher en les actions list et view, donc peut-être stocker cette information dans une variable dans la classe de domaine elle-même serait une bonne idée?

… 
Integer memberCount = members.size(); 
static constraints = { 
    memberCount(editable:false); 
} 
… 

(Est-ce la syntaxe correcte?)Modifier: Ce n'est pas la syntaxe correcte. Je ne peux pas évaluer la taille de la liste des membres, car elle n'existe pas encore et les grails se plaindront que size() ne s'applique pas aux objets nuls. Quoi d'autre pourrais-je essayer?

Cependant, comme memberCount est maintenant une variable dans la classe de domaine, il est possible d'attribuer une valeur à elle lors de la création du Branch (qui est contre-intuitive) et il ne sera pas mis à jour automatiquement lorsqu'une nouvelle Member est ajoutée.

Il est bien sûr possible d'atteindre le résultat souhaité d'une manière différente. Je pouvais manipuler le view.gsp et list.gsp dans le répertoire /Branch, ajouter quelques <td> supplémentaires là-bas, etc. Mais cela ne me semble pas très élégant.

Fondamentalement, je pense que ce que je cherche est un moyen de dire Grails qu'une certaine variable est dérivé, ne devrait pas être setable par l'utilisateur, mais la mise à jour chaque fois que nécessaire. Y a-t-il un tel moyen?

Répondre

2

Vous pouvez ajouter toute propriété que vous ne voulez pas persistais à la liste statique transients:

static transients = ['memberCount'] 

Voir this page in the manual

En outre, this StackOverflow question answers the same question


En outre, une meilleure façon de les propriétés dérivées peuvent être d'utiliser le Derived Properties feature of GORM

+0

Si la propriété 'memberCount' figure dans les listes' transients', elle ne sera pas stockée correctement dans la base de données. Mais va-t-il se mettre à jour une fois qu'un nouveau membre sera ajouté? Il me semble que je devrai utiliser la propriété dérivée de GORM que vous avez liée. – mzuba

Questions connexes