2010-09-04 15 views
1

J'ai une classe de domaine de contact qui peut être associée à plusieurs organisations, qui sont également des classes de domaine. Je souhaite utiliser une zone de sélection multiple pour permettre à l'utilisateur de sélectionner les organisations associées au contact actuel. La zone de sélection est remplie avec les organisations disponibles. Comment affecter les éléments sélectionnés à la liste des organisations de ma classe Contact?Dans Grails, comment capturer plusieurs éléments sélectionnés dans g: select?

<g:select name="organizations.id" 
      multiple="multiple" 
      optionKey="id" 
      from="${com.ur.Organization.list()}" 
      value="${contact?.organizations}" /> 

Ce qui précède est ce que je suis en train d'essayer, et si elle ne remplit la sélection avec les organisations, il ne semble pas mettre les éléments sélectionnés dans mon champ organisations.

Merci pour tout conseil.

Éditer: Commentaires incorporés de krsjunk et omarello.

Voici une version abrégée des classes de domaine.

class Contact{ 
    static searchable = true 
    static mapping = { 
     sort "lastName" 
    } 
    String firstName 
    String lastName 
    . 
    . 
    . 
    static belongsTo = [organizations:Organization, projects:Project] 
} 

class Organization { 
    static searchable = true 
    static mapping = { 
     sort "name" 
    } 
    String name 
    static hasMany = [contacts:Contact] 
} 
+0

Essayez de changer votre nom pour name = "organizations.id" – Micor

Répondre

5

bien changer juste le nom

<g:select name="organizations" multiple="multiple" 
      optionKey="id" 
      from="${com.ur.Organization.list()}" 
      value="${contact?.organizations}" /> 

Si le travail bien, juste essayé.

Remarque mes définitions de domaine ressemblent à ceci, (juste au cas où vous avez quelque chose de différent

class Contact { 

    static constraints = { 
    } 

    static hasMany = [organizations:Organization] 

    String name 
} 


class Organization { 

    static constraints = { 
    } 

    static hasMany = [contacts:Contact] 
    static belongsTo = [Contact] 

    String name 
} 
+0

Fonctionne très bien pour une seule sélection, mais lorsque je sélectionne plus d'un élément, je reçois une exception car le select renvoie une liste de chaînes représentant l'identifiant au lieu d'une liste d'objets. – nathan

+0

Hmm, avez-vous un domaine presque similaire. comme ci-dessus.J'ai juste essayé l'échantillon que j'ai créé avec la sélection multiple et il semble fonctionner correctement, sauvant et récupérant. Quelle est l'exception que vous obtenez? – omarello

+0

Ah, ma cartographie hasMany est d'organisations à contacts. Les contacts appartiennent à des organisations. Cela semble être le problème. Je vais mettre à jour la question pour mieux illustrer. Voici l'exception quand même. l'exécution de l'action [save] du contrôleur [com.ur.ContactController] a provoqué une exception: groovy.lang.MissingMethodException: aucune signature de la méthode: com.ur.Organization.get() est applicable pour les types d'argument: (java.lang.String, java.lang.String) valeurs: [2, 3] Solutions possibles: get (java.lang.Object), getId(), getAt (java.lang.String), getAll(), ident(), getLog() Servlet: grails – nathan

1

un problème est que value="contact?.organizations" devrait être value="${contact?.organizations}" - pas sûr si cela est le problème ou non. (Également, l'attribut multiple=".." n'est pas nécessaire si la valeur est une collection)

Vous pouvez également besoin name="contact.organizations" être name="contact.organizations.id" et un autre attribut optionKey="id"

+0

Faites les changements mais pas de chance. J'ai essayé d'enlever le mulitple, mais cela a fait la sélection une sélection de ligne simple ainsi je l'ai rajoutée. – nathan

+0

désolé, sans mettre en place un exemple, il est difficile de voir toutes les pièces ... avez-vous essayé value = "$ {contact? .organisations? .id}" (qui devrait fournir une collection d'ID en supposant que les organisations sont une liste d'un hasMany relation) – user439828

+0

Vous avez raison, organisations est une liste issue d'une relation hasMany. J'ai essayé d'utiliser $ {contact? .organizations? .id} mais rien n'est encore enregistré dans la liste. Est-ce que mon attribut "from" retournerait la représentation "toString" de l'organisation, qui ne serait pas mappée à la liste de l'organisation? – nathan

0

Dans votre exemple récemment modifier de domaine que vous n'avez pas un à plusieurs entre le contact et de l'organisation. vous avez un à plusieurs d'une organisation à contacter.

Alors

value="${contact?.organizations}" 

sera toujours un seul élément, jamais une liste.

Essayer de sélectionner/affecter plusieurs organisations à un contact ne sera jamais valide.

+0

Je vois ce que vous voulez dire. Comment procéder pour mettre à jour la liste des organisations afin qu'elles contiennent une référence au contact utilisant les organisations sélectionnées dans la liste? – nathan

+0

Oui, ce que krsjunk mentionné est correct, vous définissez le contact pour appartenir à une organisation, c'est-à-dire un seul. Vous devez définir un nombre a pour atteindre ce que vous voulez. Depuis un contact peut avoir plusieurs organisations associées (selon votre req initial.) – omarello

+0

Si vous souhaitez que plusieurs organisations associées à un contact donné, vous devrez changer votre modèle de domaine pour ressembler davantage à celui omarello présenté dans sa réponse. – user439828