2010-05-17 11 views
1

Je dois implémenter des valeurs de carte dans mon application Grails. J'ai une classe qui peut contenir 0..N OsmTags, et la clé est unique. En Java, je modéliserais cela avec une carte dans chaque objet, mais je ne sais pas comment mapper les classes dans Grails.Meilleure façon de modéliser des valeurs de carte dans Grails?

Je défini cette classe:

class OsmTag { 
    /** OSM tag name, e.g. natural */ 
    String key 
    /** OSM tag value, e.g. park */ 
    String value 

    static constraints = { 
     key blank:false, size:2..80,matches:/[\S]+/, unique:false 
     value blank:false, size:1..250,matches:/[\S]+/, unique:false 
    } 
} 

Cela fonctionne bien, mais il est en fait assez laid parce que la clé de la balise est pas unique. Y a-t-il une meilleure façon de modéliser ce problème?

Vive

Répondre

0

Si je comprends bien votre question, vous voulez vous assurer que chaque balise est unique dans un cas particulier de l'entité balisées?

On suppose que l'entité à laquelle les étiquettes sont attachées est nommé Taggable, alors vous pouvez appliquer cette exigence en utilisant une contrainte personnalisée:

class Taggable { 
    static hasMany = [ tags: OsmTag ] 
} 

class OsmTag { 

    static belongsTo = [ taggable: Taggable ] 

    /** OSM tag name, e.g. natural */ 
    String key 
    /** OSM tag value, e.g. park */ 
    String value 

    static constraints = { 
     key(blank:false, size:2..80,matches:/[\S]+/, unique:false, 
      validator: { val, obj -> 
       if (obj.taggable.tags.key.count(val > 1)) { 
        return false 
       } 
      } 
     ) 

     value(blank:false, size:1..250,matches:/[\S]+/, unique:false) 
    } 
} 
+0

oui c'est beaucoup mieux! Merci – Mulone

2

Si vos balises sont des chaînes simples, vous pouvez utiliser un map directly .

class Taggable { 
    Map tags // key : String, value : String 
} 
Questions connexes