2009-11-18 4 views
0

Removing an element from a list ne fonctionne pas, ce qui n'a aucun sens. Ai-je manqué des sémantiques particulières propres à la gestion d'une liste d'objets de domaine Grails?Groovy sur la liste des Grails - ne fonctionne pas?

Contrôleur:

def userCreate = { 
    def workgroupInstance = new Workgroup() 
    workgroupInstance.manager = authUserDomain 
    flash.message = User.list().toString() 
    def usersWithoutThisOne = User.list() - authUserDomain 
    flash.message = flash.message + "removed ${authUserDomain}, new list is ${usersWithoutThisOne}" 
    return ['workgroupInstance':workgroupInstance, 'users':usersWithoutThisOne] 
} 

Les résultats dans ce affichés dans flash.message

[boogie, toogie, choogie, biscuit] enlevé boogie, la nouvelle liste est [boogie, toogie, choogie , cookie]

+0

"Groovy sur Rails Groovy", quoi :) (* pas tous les mots à la mode doivent être mélangés ensemble - bonne question cependant! *) – Esko

+0

Il est probablement juste de dire que Grails est "inspiré par" Rails, mais pas _exactly_ Rails (http: //www.grails.org/Grails+vs+Rails+Benchmark) http://www.jtict.com/blog/grails-vs-rails/ –

Répondre

2

Si vous souhaitez supprimer définitivement l'utilisateur du groupe de travail, vous devez utiliser la fonction Grails removeFrom pour supprimer les classes stockées dans un a beaucoup d'association.

+0

Droit, mais il ne s'agit pas d'une suppression permanente de la base de données, mais de revenir à une vue afin qu'un utilisateur ne puisse pas s'ajouter à un groupe auquel il participe déjà. (ce qui serait redondant, évidemment) Je voudrais savoir pourquoi la manipulation de la liste échoue silencieusement ou "fonctionne", mais ne fonctionne pas vraiment –

+0

Je pense que les méthodes de domaine comme list, findBy etc retournent un PersistentSet? m devinant qu'il écrase le comportement de minus et ne fait rien.Pourquoi le retourner et collecter tous les utilisateurs qui ne sont pas authUserDomain – leebutts

+0

Ouais, quelque chose comme User.findAllByIdNotEqual (user.id)? – Blacktiger

0

Je ne suis pas sûr de celui-ci. Ne pas avoir un interprète Groovy disponible pour le moment. Mais IIRC et comme this article suggère, le - sur les listes prévoit d'opérer sur deux listes, à savoir,

list - other 

est en fait plus comme

list.removeAll(other) 

(en termes Java), et non l'intention

list.remove(other) 

Vous pouvez essayer

modifiedList = originalList - [elementToRemove] 
+0

Malheureusement pas: def usersWithoutThisOne = User.list() - [authUserDomain] -> [a, b, c, d] supprimé a, la nouvelle liste est [a, b, c, d] L'article dit "La classe Groovy GDK List supporte l'opérateur - de la même manière qu'elle supporte le + L'extrait de code suivant illustre la suppression d'une liste d'une autre à l'aide de la méthode List.minus (Collection) (il existe également une version surchargée pour la suppression d'un objet fourni individuellement) et l'utilisation de l'opérateur -. Je suis perplexe. –

+1

FYI, vous pouvez toujours obtenir un interpréteur en ligne ici: http://groovyconsole.appspot.com/ –

4

D'où provient authUserDomain?

Si vous n'avez pas implémenté un customn .equals() sur l'utilisateur (basé sur le nom d'utilisateur ou un autre unique identifié) alors il peut ne pas être le même objet qui est retourné via User.list(). Un élément ne sera supprimé que s'il correspond à un objet existant en utilisant .equals()

+0

Vient du plugin de sécurité Acegi Spring. Leur objet Person par défaut n'implémente pas en fait les égales. J'ai implémenté une version Object et une version Person, et le résultat reste le même. –

+0

Alors qu'est-ce que vous obtenez de: println User.list(). Collect {it.equals (authUserDomain)} Une liste contenant tous les faux que je m'attendais. Ce qui signifie qu'il y a quelque chose de cassé avec votre méthode .equals() – leebutts

+0

Je souhaite: [[email protected], [email protected], [email protected], [email protected]] [false, false, true, false] supprimé [email protected], la nouvelle liste est [[email protected], [email protected], [email protected], [email protected]] est ma sortie après l'ajout de flash.message + = "$ {User. list(). collect {it.equals (authUserDomain)}} "ci-dessus –

Questions connexes